什么是约束
• 为了保证数据的一致性和完整性,SQL规范以约束的方式对表数据进行额外的条件限制。
• 约束是表级的强制规定
• 可以在创建表时规定约束(通过 CREATETABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)
约束类型
Mysql的五种约束:
•NOT NULL :非空约束,规定某个字段不能为空
• UNIQUE : 唯一约束,规定某个字段在整个表中是唯一的
•PRIMARY KEY :主键(非空且唯一)
•FOREIGN KEY :外键
•DEFAULT :默认值
NOT NULL 约束
•非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
•Null类型特征:
- 所有的类型的值都可以是null,包括int、float等数据类型
- 空字符串””不等于null,0也不等于null
CREATE TABLE emp(
id INT(10) NOT NULL,
NAME VARCHAR(20) NOT NULL DEFAULT 'abc',
sex CHAR NOT NULL
);
UNIQUE 约束
下面约束表示用户名和密码组合不能重复
CREATE TABLE USER(
id INT NOT NULL,
NAME VARCHAR(25),
PASSWORD VARCHAR(16),
#使用表级约束语法
CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
);
• 同一个表可以有多个唯一约束,多个列组合的约束。在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。
• MySQL会给唯一约束的列上默认创建一个唯一索引
PRIMARY KEY 约束
• 主键约束=唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值
• 如果是多列组合的主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
• 每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别上创建。
• MySQL的主键名总是PRIMARY,当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
CREATE TABLE emp4(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20)
);
FOREIGN KEY 约束
• 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
• 从表的外键值必须在主表中能找到或者为空。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。
• 还有一种就是级联删除子表数据。
• 注意: 外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列
• 同一个表可以有多个外键约束
– FOREIGN KEY: 在表级指定子表中的列
– REFERENCES: 标示在父表中的列
–ON DELETE CASCADE(级联删除): 当父表中的列被删除时,子表中相对应的列也被删除(少用)
–ON DELETE SET NULL(级联置空): 子表中相应的列置空(少用)
-- Table:product
drop table if exists product;
create table product(
product_code int primary key not null auto_increment,
product_name varchar(128) not null,
product_category varchar(16) not null
);
-- Table:sales_order
drop table if exists sales_order;
create table sales_order(
order_number int primary key not null auto_increment,
customer_number int /*references customer(customer_number)*/ not null, -- 弱约束
product_code int not null,
order_date date not null,
entry_date date not null,
order_amount int not null
);
-- add contraint 强约束
alter table sales_order add constraint fk_product_order
foreign key (product_code) references product(product_code);