您的位置:首页 > 数据库

2.数据库约束

2016-01-23 15:32 267 查看
约束:
        在表上强制执行的数据校验规则,保证数据库里数据的完整性。当表中数据相互依赖时,保证相关数据不被删除。
        也是数据库对象,也有自己的名字。
        约束通常无法修改。
大部分数据库支持一下5种约束:

NOT NULL:非空约束,指定某列不能为空;
UNIQUE:唯一约束,指定某列或几列组合的数据不能重复;
PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录;
FOREIGN KEY:外键,指定改行记录从属于主表中的一条记录,主要用于保证参照完整性;
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约束,甚至更复杂的完整性约束。

欢迎个人转载,但须在文章页面明显位置给出原文连接;
未经作者同意必须保留此段声明、不得随意修改原文、不得用于商业用途,否则保留追究法律责任的权利。

【 CSDN 】:csdn.zxiaofan.com
【GitHub】:github.zxiaofan.com

如有任何问题,欢迎留言。祝君好运!
Life is all about choices!
将来的你一定会感激现在拼命的自己!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: