约束

# 有以下六种约束:
# – NOT NULL 非空约束,规定某个字段不能为空
# – UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
# – PRIMARY KEY 主键(非空且唯一)
# – FOREIGN KEY 外键
# – CHECK 检查约束
# – DEFAULT 默认值
# 注意: MySQL不支持check约束,但可以使用check约束,而没有任何效果;

# 根据约束数据列的限制,约束可分为:
# – 单列约束:每个约束只约束一列
# – 多列约束:每个约束可约束多列数据

# 根据约束的作用范围,约束可分为:
# – 列级约束只能作用在一个列上,跟在列的定义后面
# – 表级约束可以作用在多个列上,不与列一起,而是单独定义

# 外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
# 从表的外键值必须在主表中能找到或者为空。当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据。
# 还有一种就是级联删除子表数据。
# 注意:外键约束的参照列,在主表中引用的只能是主键或唯一键约束的列
# 同一个表可以有多个外键约束

# 增加 not null 约束:
ALTER TABLE ee
MODIFY name int NOT NULL;

# 取消 not null 约束:
ALTER TABLE ee
MODIFY name int NULL;

# 取消 not null 约束,增加默认值
ALTER TABLE ee
MODIFY name VARCHAR(15) DEFAULT 'abc' NULL;

# 使用UNIQUE 约束
CREATE TABLE USER1(
id INT NOT NULL,
NAME VARCHAR(25),
PASSWORD VARCHAR(16),
#使用表级约束语法
CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
);
# 添加唯一约束
ALTER TABLE USER1
ADD UNIQUE(NAME,PASSWORD);

# 删除约束
ALTER TABLE USER1
DROP INDEX uk_name_pwd;

# PRIMARY KEY 约束
# (列级模式)
CREATE TABLE emp4(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20)
);

# (表级模式)
CREATE TABLE emp5(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp5_id_pk PRIMARY KEY(id)
);

# (组合模式)
CREATE TABLE emp6(
id INT NOT NULL,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp7_pk PRIMARY KEY(NAME,pwd)
);
# 删除主键约束
ALTER TABLE emp5 DROP PRIMARY KEY;

# 添加主键约束
ALTER TABLE emp5 ADD PRIMARY KEY(NAME,pwd);

# 修改主键约束
ALTER TABLE emp5 MODIFY id INT PRIMARY KEY;

# FOREIGN KEY 约束
#  创建外键约束:

CREATE TABLE dept(
dept_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(20)
);

CREATE TABLE emp(
emp_id INT AUTO_INCREMENT PRIMARY KEY,
last_name VARCHAR(15),
dept_id INT,

CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id)
REFERENCES dept(dept_id)
);

# 创建多列外键组合,必须使用表级约束:
#   主表
        CREATE TABLE classes(
        id INT,
        NAME VARCHAR(20),
        number INT,
        PRIMARY KEY(NAME,number)
        );

#   从表
       CREATE TABLE student(
       id INT AUTO_INCREMENT PRIMARY KEY,
       classes_name VARCHAR(20),
       classes_number INT,
       FOREIGN KEY(classes_name,classes_number)
       references classes(NAME,number)
       );

# 删除外键约束:
ALTER TABLE emp
DROP FOREIGN KEY emp_dept_id_fk;

# 增加外键约束:
ALTER TABLE emp
ADD CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id)
REFERENCES dept(dept_id);

# – FOREIGN KEY: 在表级指定子表中的列
# – REFERENCES: 标示在父表中的列
# –ON DELETE CASCADE(级联删除): 当父表中的列被删除
# 时,子表中相对应的列也被删除
# –ON DELETE SET NULL(级联置空): 子表中相应的列置空

CREATE TABLE student(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(20),
classes_name VARCHAR(20),
classes_number INT,
/*表级别联合外键*/
FOREIGN KEY(classes_name, classes_number)
REFERENCES classes(NAME, number) ON DELETE CASCADE);

 

上一篇:mybats sql语句记录


下一篇:安卓移动端唤起拨号与邮箱