2.数据库约束

约束:

        在表上强制执行的数据校验规则,保证数据库里数据的完整性。当表中数据相互依赖时,保证相关数据不被删除。

        也是数据库对象,也有自己的名字。

        约束通常无法修改。

大部分数据库支持一下5种约束:

  1. NOT NULL:非空约束,指定某列不能为空;
  2. UNIQUE:唯一约束,指定某列或几列组合的数据不能重复;
  3. PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录;
  4. FOREIGN KEY:外键,指定改行记录从属于主表中的一条记录,主要用于保证参照完整性;
  5. CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。

MySQL不支持CHECK约束(可以使用,但没有任何作用)。

约束分类:

①单列约束;②多列约束(可约束多个数据列)。

约束时机:

  • 建表同时为相应数据列指定约束;
  • 建表后创建,以修改表的方式增加约束。

列级约束语法、表级约束语法。

Note:

        MySQL使用information_schema数据库的TABLE_CONSTRAINTS表保存该数据库实例的所有约束信息,可通过该表查询。

SQL中的null:

        不区分大小写;所有类型均可以为null(包括int、boolean);空字符串和0不等于null。

1、NOT NULL:列级

有not null当然也有null。

①建表指定:

CREATE TABLE person (

    id INT NOT NULL,

    age VARCHAR(2)NULL

)

②alter修改表时增删:

ALTER TABLE person
#增加非空约束

MODIFY username VARCHAR(10)NO
TNULL,

 #取消非空约束

MODIFY age INT NULL,

 #取消非空约束,并指定默认值

MODIFY grade INT DEFAULT 99 NULL;

 2、UNIQUE:列级、表级

列不可以出现重复值,null除外(数据库中null不等于null)。

单列:使用列级约束语法【第一约束名即为字段名,其他加序号,如id_2】

CREATE TABLE unique_test (id INT UNIQUE);

多列、自行指定约束名:使用表级约束语法【格式:constraint 约束名 约束定义】

①建表时-分别建立唯一约束:

CREATE TABLE unique_test (

    #非空约束

    id INT NOT NULL,

    uname VARCHAR(25),

    pwd VARCHAR(25),

    #表级约束语法建立唯一约束

    UNIQUE(uname),

    #表级约束语法建立唯一约束,并指定约束名uni

    CONSTRAINT uni UNIQUE(pwd)

);

②建表时-列组合建立唯一约束:

CREATE TABLE unique_test (

    #非空约束

    id INTNOTNULL,

    uname VARCHAR(25),

    pwd VARCHAR(25),

    #表级约束语法建立唯一约束,指定3列组合【不允许同时重复】

    CONSTRAINT uni UNIQUE(id, uname, pwd)

);

③修改表时,add【表级约束语法】

ALTER TABLE unique_test

ADD UNIQUE(id, uname, pwd);

④修改表时,modify【只能对单列采用列级约束】

ALTER TABLE unique_test

 MODIFY id INT UNIQUE;

⑤删除约束

大部分数据库使用“drop constraint 约束名”,MySql使用“drop index 约束名”。

ALTER TABLE unique_test

 DROP INDEX id;

 3、PRIMARY KEY:列级、表级

  • 主键约束等价于非空约束+唯一约束(不允许重复和null值)。
  • 主键列的值可用于唯一标识表中的一条记录。
  • 每个表最多一个主键,但主键约束可由多个数据列组合而成。
  • 大部分数据库允许定义主键约束的名字,MySql出于保持与标准SQL的兼容性,允许命名,但这个名字没有任何作用,主键名依旧是PRIMARY。

主键约束与唯一约束语法非常相似,只是使用primary key。

①建表时-列级约束语法:

CREATE TABLE unique_test (id INT PRIMARY KEY);

②建表时-表级约束语法:

CREATE TABLE unique_test (

    id INT,

    uname VARCHAR(25),

    #指定主键名对MySql无效,依旧是primary

    CONSTRAINT myPrimary PRIMARY KEY(id),

   #多列组合主键约束

    #CONSTRAINT myPrimary PRIMARY KEY(id, uname)

);

②删除主键约束

ALTER TABLE unique_test DROP PRIMARY KEY;

③修改表时,add【表级约束语法】

ALTER TABLE unique_test

ADD PRIMARY KEY(id, uname, pwd);

④修改表时,modify【只能对单列采用列级约束】

ALTER TABLE unique_test

 MODIFY id INT PRIMARY KEY;

自增长【整型】:auto_increment

CREATETABLE auto_inc_test (

    id intauto_incrementPRIMARYKEY,

    uname VARCHAR(25)

);

4、FOREIGN KEY:列级、表级

  • 外键约束:保证一个或两个数据表之间的参照完整性,构建于一个表的两个字段或两个表的两个字段间的参照关系;
  • 外键确保两相关字段的参照关系:子(从)表外键列的值必须在被参照列的值范围内,或为空(可自行增加非空约束);
  • 删除:欲删除(被从表记录参照的)主表记录,必须先删除从表里参照该记录的所有记录;或删主表记录时级联删除从表中所有参照该记录的从表记录;
  • 外键只能参照主表主键列或唯一键列;
  • 一个表可有多个外键;
  • MySql也会为外键约束列建立索引;
  • 用于实体间一对多<多的一端增加外键列>、一对一<任一方增加外键列,再增加唯一约束>的关联关系(多对多需额外增加一个连接表记录其关系);

①列级约束语法:REFERENCES 【出于保持与标准SQL的兼容性,实际无效,只能使用表级约束语法】

#为保证从表参照的主表存在,应先建主表

CREATE TABLE teacher_table (

    id INT auto_increment,

    uname VARCHAR(25),

    PRIMARY KEY(id)

);

 

CREATE TABLE student_table (

    stu_id INT auto_increment PRIMARY KEY,

    stu_name VARCHAR(25),

    java_teacher INTREFERENCES teacher_table (id)

);

②表级约束语法:

#为保证从表参照的主表存在,应先建主表

CREATE TABLE teacher_table (

    id INT auto_increment,

    uname VARCHAR (25),

    PRIMARY KEY (id)

);

CREATE TABLE student_table (

    stu_id INT auto_increment PRIMARY KEY,

    stu_name VARCHAR(25),

    java_teacher INT,

    #constraint指定外键约束名

    CONSTRAINT stu_tea_fk FOREIGN KEY(java_teacher)REFERENCES teacher_table (id)

);

MySql外键约束名默认为:table_name_ibfk_n,table_name是从表表名,n是从1开始的正数。

#为保证从表参照的主表存在,应先建主表

CREATE TABLE teacher_table (

    id INT auto_increment,

    uname VARCHAR(25),

    #必须以列组合建立主键

    PRIMARYKEY(id, uname)

);

 

CREATE TABLE student_table (

    stu_id INT auto_increment PRIMARY KEY,

    stu_name VARCHAR(25),

    java_teacher INT,

    #CONSTRAINT指定外键约束名

    CONSTRAINT stu_tea_fk FOREIGN KEY(java_teacher, stu_name)REFERENCES teacher_table (id, uname)

);

③删除外键约束:DROP

ALTER TABLE student_table

 DROP FOREIGN KEY stu_tea_fk;
#stu_tea_fk为外键名

④增加外键约束:ADD FOREIGN KEY

ALTER TABLE student_table

 ADD FOREIGN KEY(stu_id, stu_name)

    REFERENCES teacher_table (id, uname);

⑤自关联:参照自身

CREATE TABLE student_table (

    stu_id INT auto_increment PRIMARYKEY,

    stu_name VARCHAR(25),

    refer_id INT,

    CONSTRAINT stu_tea_fk FOREIGNKEY(refer_id)REFERENCES student_table (stu_id)

);

⑥级联删除:

ON DELETE CASCADE:删除主表时,从表记录全部级联删除;

ON DELETE SET NULL:删除主表时,参照该主表记录的外键设为null。

#为保证从表参照的主表存在,应先建主表

CREATE TABLE teacher_table (

    id INT auto_increment,

    uname VARCHAR(25),

    #必须以列组合建立主键

    PRIMARY KEY(id, uname)

);

 

CREATE TABLE student_table (

    stu_id INT auto_increment PRIMARY KEY,

    stu_name VARCHAR(25),

    #CONSTRAINT指定外键约束名

    #定义级联删除

    #亦可onDELETESETNULL

    CONSTRAINT stu_tea_fk FOREIGNKEY(stu_id)REFERENCES teacher_table (id)ONDELETECASCADE

);

5、CHECK【MySql无效】

CREATE TABLE check_test (

    id INT auto_increment,

    uname VARCHAR(25),

    PRIMARY KEY(id),

    CHECK(id >10)
# 要求id>10

);

可借助MySql的触发机制来实现CHENCK约束,甚至更复杂的完整性约束。

时间: 2024-09-27 01:02:00

2.数据库约束的相关文章

SQLite数据库约束详解

一.约束 Constraints 在SQLite数据库中存储数据的时候,有一些数据有明显的约束条件. 比如一所学校关于教师的数据表,其中的字段列可能有如下约束: 年龄 - 至少大于20岁.如果你想录入一个小于20岁的教师,系统会报错. 国籍 - 默认中国.所谓默认,就是如果你不填写,系统自动填上默认值. 姓名 - 不能为空.每个人都有名字嘛. 员工号 - 唯一.这个可不能乱,工资发错了就麻烦了. 上面提到的大于.默认.不能为空.唯一等等,就是数据的约束条件. 我们在用CREATE TABLE 创

SQL Server创建数据库和数据表的相关约束实现方法_MsSql

本文分析了SQL Server创建数据库和数据表的相关约束实现方法.分享给大家供大家参考,具体如下: 创建约束语法如下: CREATE DATABASE [test] ON (NAME=N'test',FILENAME=N'd:\SQL2kt_Data\test.mdf',SIZE=3mb,MAXSIZE=UNLIMITED,FILEGROWTH=1MB) LOG ON (NAME=N'test_log',FILENAME=N'd:\SQL2kt_Data\test_log.ldf',SIZE=

什么是数据库的约束?

  数据库约束是防止非法记录的规则, 约束保存在数据字典(data dictionary)中, 约束可以被定义在列级或者表级.   Oracle中包括一下集中约束:   1. Not Null    - 明确一列数据不能包含null值   2. Unique      - 强制所有数据行不能有重复值   3. Primary Key - 每一行数据的唯一标示   4. Foreign Key - 强制一列数据与引用表的外键约束关系   5. Check       - 检查,明确规定一个必须为t

OCP1z0-047 : 约束―――延迟约束

这题是考延迟约束的相关知识点.在表CUST设了主键cust_id(唯一并且非空),在主键设延迟约束,所谓延迟约束就是在dml时数据库不判断数据是否满足约束,在commit时来判断,如果commit,做dml操作时(这道题是插入的数据如果不满足约束条件那就会做rollback) 这道题中,第一行,第二行数据的cust_id都为1,重复了,在提交时肯定会报错,结果会回滚.相当于第一行,第二行不会插入到表CUST中. 第三行,第四行的cust_id分别为1和2,没有重复,提交时插入成功,会永久保存.

《七周七数据库》一一2.2 第1天:关系、CRUD和联接

2.2 第1天:关系.CRUD和联接 七周七数据库 我们虽然不会把你当作是一个关系数据库专家,但是确实会假设你曾用过一两个数据库.这些数据库很可能是关系型的.我们将开始创建自己的数据表,并填充数据.然后尝试查询一些行.最后探讨关系数据库中非常重要的表联接. 就像大多数数据库一样,Postgres提供一个后台服务进程(Backend),它完成所有数据处理工作,还提供一个命令行客户端程序,通过它连接到运行中的服务进程.服务进程默认监听5432端口,可以用psql这个命令行工具连接. 数学关系 关系数

浅析sql server 公共表达式的简单应用_数据库其它

一.前言 现在做项目数据访问基本都会选择一种orm框架,它以面向对象的形式屏蔽底层的数据访问形式,让开发人员更集中在业务处理上,而不是和数据库的交互上,帮助我们提高开发效率:例如一些简单的insert.update,我们不需要写insert into...sql 语句,而是直接new一个实体对象,然后db.Insert(entity),看起来是那么清爽:像EF这样比较完善的orm,支持linq语法对数据库进行访问,写起来就更加爽了,有些人甚至认为开发人员可以不用会写sql语句了...但现实不会让

asp.net中将EXCEL读取后导入到access数据库中,一直是第64条记录出错,提示conn.open错误

问题描述 上网搜索,有的说是sqlldr缺省是64条记录出错就会退出,我的代码是循环读取EXCEL中的数据进行判断是否与数据库中相同,EXCEL已经成功上传会不会是这儿有错误,没有关闭CONN??using(OleDbConnectionconn=newOleDbConnection(AccessHelper.connStr)){for(inti=0;i<dr.Length;i++){if(i==0)//标题行,判断第一行标题是否正确{if(dr[i][0].ToString().ToUpper

《DBA修炼之道:数据库管理员的第一本书》——2.4节数据库标准与过程

2.4 数据库标准与过程想要有效地使用新安装的DBMS,必须开发使用数据库的标准和过程.研究表明,相比标准化较低的公司,那些高标准化的公司可以将用于支持终端用户的成本降低35%甚至更多.必须开发使用数据库的标准和过程.标准是用于确保数据库环境的一致性和有效性的常见做法,如数据库命名约定.程序是定义好的.步进式的指示,用于指导处理具体事件的事务,如灾难恢复计划.未能实现数据库标准和过程会使数据库环境变得混乱且难以管理.DBA应当开发数据库标准和过程,以此作为企业范围内IT标准和过程的组成部分.它们

【赠书】从商用到开源:15个维度,全面剖析DB2与MySQL数据库的差异

云和恩墨为某证券公司进行了从DB2到MySQL数据库系统的迁移论证.验证,对两类数据库展开全方位多角度的对比分析,并根据用户的业务现状进行了相关架构.性能.备份恢复及高可用验证.本系列将带领大家全面学习DB2迁移至MySQL的实践. 前文回顾: 从商用到开源:DB2迁移至MySQL的最佳实践 今天一起来学习DB2与MySQL数据库的特征对比.快上车! 一.隔离级别 标准的隔离级别共四个,分别是: 未授权读取 也称为读未提交(ReadUncommitted):允许脏读取,但不允许更新丢失.如果一个