- NOT NULL:非空约束,指定某列不能为空;
- UNIQUE:唯一约束,指定某列或几列组合的数据不能重复;
- PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录;
- FOREIGN KEY:外键,指定改行记录从属于主表中的一条记录,主要用于保证参照完整性;
- CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。
- 建表同时为相应数据列指定约束;
- 建表后创建,以修改表的方式增加约束。
CREATE TABLE person (
id INT NOT NULL,
age VARCHAR(2)NULL
)
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);
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)
);
ALTER TABLE unique_test
ADD UNIQUE(id, uname, pwd);
ALTER TABLE unique_test
MODIFY id INT UNIQUE;
ALTER TABLE unique_test
DROP INDEX id;
- 主键约束等价于非空约束+唯一约束(不允许重复和null值)。
- 主键列的值可用于唯一标识表中的一条记录。
- 每个表最多一个主键,但主键约束可由多个数据列组合而成。
- 大部分数据库允许定义主键约束的名字,MySql出于保持与标准SQL的兼容性,允许命名,但这个名字没有任何作用,主键名依旧是PRIMARY。
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;
ALTER TABLE unique_test
ADD PRIMARY KEY(id, uname, pwd);
ALTER TABLE unique_test
MODIFY id INT PRIMARY KEY;
CREATETABLE auto_inc_test (
id intauto_incrementPRIMARYKEY,
uname VARCHAR(25)
);
- 外键约束:保证一个或两个数据表之间的参照完整性,构建于一个表的两个字段或两个表的两个字段间的参照关系;
- 外键确保两相关字段的参照关系:子(从)表外键列的值必须在被参照列的值范围内,或为空(可自行增加非空约束);
- 删除:欲删除(被从表记录参照的)主表记录,必须先删除从表里参照该记录的所有记录;或删主表记录时级联删除从表中所有参照该记录的从表记录;
- 外键只能参照主表主键列或唯一键列;
- 一个表可有多个外键;
- MySql也会为外键约束列建立索引;
- 用于实体间一对多<多的一端增加外键列>、一对一<任一方增加外键列,再增加唯一约束>的关联关系(多对多需额外增加一个连接表记录其关系);
#为保证从表参照的主表存在,应先建主表
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)
);
#为保证从表参照的主表存在,应先建主表
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)
);
ALTER TABLE student_table
DROP FOREIGN KEY stu_tea_fk; #stu_tea_fk为外键名
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)
);
#为保证从表参照的主表存在,应先建主表
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
);
CREATE TABLE check_test (
id INT auto_increment,
uname VARCHAR(25),
PRIMARY KEY(id),
CHECK(id >10) # 要求id>10
);