约束
什么是约束?约束的作用
在表的创建时,加入约束对表中数据进行规范,确保数据完整性、有效性
常见约束
-
非空约束 NOT NULL -- 不能为NULL
-
DROP TABLE IF EXISTS t_vip; CREATE TABLE t_vip( id INT, name VARCHAR(255) NOT NULL );
-
-
唯一性约束 UNIQUE -- 不能重复但可以为NULL
-
DROP TABLE IF EXISTS t_vip; CREATE TABLE t_vip( id INT UNIQUE NOT NULL, // 同时被UNIQUE 和 NOT NULL 约束,自动成为主键 name VARCHAR(255) UNIQUE, email VARCHAR(255) ); INSERT INTO t_vip (id, name, email) VALUES (1, NULL,'aaa@aaa'); INSERT INTO t_vip (id, name, email) VALUES (2, NULL,'aaa@aaa');
-
MySQL中,同时被UNIQUE 和 NOT NULL 约束,自动成为主键 (Oracle中不一样)
-
两个或多个字段联合判断唯一性 UNIQUE(字段1 , 字段2 , ... )
-
DROP TABLE IF EXISTS t_vip; CREATE TABLE t_vip( id INT, name VARCHAR(255), email VARCHAR(255), UNIQUE(name, email) ); INSERT INTO t_vip (id, name, email) VALUES (1, 'zhangsan','aaa@aaa'); INSERT INTO t_vip (id, name, email) VALUES (2, 'lisi','aaa@aaa'); INSERT INTO t_vip (id, name, email) VALUES (2, 'zhangsan','bbb@bbb');
-
-
主键约束 PRIMARY KEY
-
外键约束 FOREIGN KEY
-
检查约束 CHECK(MySQL不支持,Oracle支持)
主键约束 PRIMARY KEY 简称PK
-
添加主键约束的字段称为主键字段
-
主键字段中的值称为主键值
-
主键值是每一条记录的唯一标识
-
主键 = NOT NULL + UNIQUE 不能为空不能重复
-
DROP TABLE IF EXISTS t_vip; CREATE TABLE t_vip( id INT PRIMARY KEY, // 列级约束 name VARCHAR(255) UNIQUE, email VARCHAR(255) );
-
DROP TABLE IF EXISTS t_vip; CREATE TABLE t_vip( id INT, name VARCHAR(255) UNIQUE, email VARCHAR(255), PRIMARY KEY(id) // 表级约束 );
-
表级约束可用于多字段联合主键
-
DROP TABLE IF EXISTS t_vip; CREATE TABLE t_vip( id INT, name VARCHAR(255), email VARCHAR(255), PRIMARY KEY(id, name) // 表级约束 联合主键 );
-
但开发中不建议使用复合主键,更多使用单一主键
-
-
主键值建议使用 INT BIGINT CHAR,主键值一般都为定长
-
自然主键
- 主键值是一个自然数,与业务无关
-
业务主键
- 主键值与业务关联,例如:学号、银行卡号等特殊唯一标识做主键
- 在实际开发中,自然主键使用更多,因为主键不需要有意义,只用来确保记录不重复即可
- 主键一旦和业务挂钩,但业务发生变动时,可能影响主键值,因此业务主键不推荐使用
-
AUTO_INCREMENT -- MySQL中,采用自增可以自动维护一个主键值
-
DROP TABLE IF EXISTS t_vip; CREATE TABLE t_vip( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), email VARCHAR(255) );
-
插入数据时,无需再传入 id 值
-
外键约束 FOREIGN KEY 简称FK
-
添加外键约束的字段称为外键字段
-
外键字段中的值称为外键值
-
使用规则:
-
表A中的 t字段是表B的主键,则表A 必须?将 t字段设置为外键,以此约束 t字段的内容从而符合表B
-
或者 t字段在表B中是 UNIQUE字段,具有唯一标识的字段,则也可以设置为外键
-
-
SQL语句:表A的表级约束中 FOREIGN KEY (字段a) REFERENCES 表B (字段b)
-
表A从表B继承字段b,命名为字段a,因此表A为“子表”,在建表时,表A一定在表B之后创建
-
DROP TABLE IF EXISTS t_student; DROP TABLE IF EXISTS t_class; CREATE TABLE t_class( classno INT PRIMARY KEY, classname VARCHAR(255) ); CREATE TABLE t_student( no INT PRIMARY KEY, name VARCHAR(255), cno INT, FOREIGN KEY(cno) REFERENCES t_class(classno) );
-
表A在插入数据时,字段a 的内容会有和 字段b 相同的约束
-
父表中被引用的字段必须是主键吗?
- 不一定是主键,外键可以为NULL,但必须具有唯一性 UNIQUE
-
一个表的字段是另一个表的主键,一定要建立外键关系吗?
- 一定要建立外键关系,否则两张表没有关联