- 实体完整性(Entity Integrity) :例如,同一个表中,不能存在两条完全相同无法区分的记录。
- 域完整性(Domain Integrity) :例如:年龄范围0-120,性别范围“男/女”。
- 引用完整性(Referential Integrity) :例如:员工所在部门,在部门表中要能找到这个部门。
- 用户自定义完整性(User-defined Integrity) :例如:用户名唯一、密码不能为空等,本部门经理的工资不得高于本部门职工的平均工资的5倍。
- NOT NULL 非空约束,规定某个字段不能为空
- UNIQUE 唯一约束,规定某个字段在整个表中是唯一的
- PRIMARY KEY 主键(非空且唯一)约束
- FOREIGN KEY 外键约束
- DEFAULT 默认值约束
- 在创建表时规定约束:CREATE TABLE…
- 在表创建后添加约束:ALTER TABLE …
- 查看某个表已有的约束:
SELECT * FROM information_schema.table_constraints WHERE table_name = ‘table name’;- 查看表索引:SHOW INDEX FROM tablename;
# 建表时非空约束
CREATE TABLE emp (id INT(10) NOT NULL,name VARCHAR(20) NOT NULL,sex CHAR NULL
);
# 建表后非空约束
ALTER TABLE emp
MODIFY sex VARCHAR(20) NOT NULL;ALTER TABLE emp
MODIFY name VARCHAR(15) DEFAULT 'abc' NOT NULL;# 删除非空约束
ALTER TABLE emp
MODIFY sex VARCHAR(20) NULL;
# 建表时唯一性约束
CREATE TABLE stu3 (sid INT NOT NULL UNIQUE KEY,cardid VARCHAR(20) UNIQUE,phone INT UNIQUE KEY,name VARCHAR(25),password VARCHAR(16),address VARCHAR(18),age INT,childs INT,UNIQUE KEY(name, password),UNIQUE(address, age),CONSTRAINT stu3_constraint UNIQUE(sid, cardid)
);
-- UNIQUE KEY 等同于 UNIQUE
-- NOT NULL && UNIQUE 等同于 PRIMARY KEY
-- CONSTRAINT ... UNIQUE() 表级约束CREATE TABLE stu2 (sid INT NOT NULL,name VARCHAR(25) DEFAULT 'abc',password VARCHAR(16),cardid VARCHAR(20) UNIQUE,phone INT UNIQUE KEY,address VARCHAR(18),age INT,childs INT,CONSTRAINT stu2_name_pwd UNIQUE(name, password)
);DESC stu2;
DROP TABLE stu2;
# 建表后唯一性约束
ALTER TABLE 表名称 ADD UNIQUE KEY (字段列表);# sid 既非NULL又唯一时会变为主键PrimaryKey
ALTER TABLE stu2 ADD UNIQUE KEY(sid);
-- sid key : PRIALTER TABLE stu2 ADD UNIQUE KEY(address, age, childs);
ALTER TABLE stu2 ADD CONSTRAINT stu2_age_childs UNIQUE(address, age, childs);# 也可以直接改变字段属性
ALTER TABLE stu2 MODIFY sid INT NOT NULL UNIQUE;
-- sid key: PRI
ALTER TABLE stu2 MODIFY sid INT UNIQUE;
-- sid key: UNISELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE table_name = 'stu2';# 删除唯一性约束
ALTER TABLE stu2 DROP INDEX stu2_age_childs;
# 列级约束PRIMARY KEY
CREATE TABLE temp1(id INT PRIMARY KEY,name VARCHAR(20)
);
# 列级约束组合
CREATE TABLE temp2 (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(20),PRIMARY KEY(id, name)
);
# 表级约束
CREATE TABLE temp2 (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(20),CONSTRAINT temp2_id_pk PRIMARY KEY(id)
);
# 表级约束组合
CREATE TABLE temp3 (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(20),CONSTRAINT temp3_id_pk PRIMARY KEY(id, name)
);
-- id 和 name 均为非NULL且PRI# 建表后 PRIMARY KEY
ALTER TABLE temp ADD PRIMARY KEY(id);
ALTER TABLE temp ADD PRIMARY KEY(id, name);# 删除主键约束,不需要指定主键名
ALTER TABLE temp DROP PRIMARY KEY;
create table 表名称(字段名 数据类型 primary key auto_increment,字段名 数据类型 unique key not null,字段名 数据类型 unique key,字段名 数据类型 not null default 默认值,
);
create table 表名称(字段名 数据类型 default 默认值,字段名 数据类型 unique key auto_increment,字段名 数据类型 not null default 默认值,,primary key(字段名)
);-- 不建议只写KEY,虽然默认key = primary key
CREATE TABLE auto(id INT KEY AUTO_INCREMENT,name VARCHAR(20)
);CREATE TABLE auto2(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20)
);CREATE TABLE auto3(id INT UNIQUE KEY AUTO_INCREMENT,name VARCHAR(20) PRIMARY KEY
);# 建表后增加自增
ALTER TABLE auto3
MODIFY id INT AUTO_INCREMENT;# 去掉auto_increment相当于删除
ALTER TABLE auto3
MODIFY id INT;
create table 主表名称(字段1 数据类型 primary key,字段2 数据类型
);
create table 从表名称(字段1 数据类型 primary key,字段2 数据类型,[CONSTRAINT <外键约束名称>] FOREIGN KEY(从表的某个字段) references 主表名(被参考字段)
);CREATE TABLE depx(did INT PRIMARY KEY,dname VARCHAR(20)
);
CREATE TABLE empx(eid INT PRIMARY KEY,ename VARCHAR(20),depxid INT,FOREIGN KEY (depxid) REFERENCES depx(did)
);
-- depxid KEY: MUL DESC depx;
DESC empx;
ALTER TABLE 从表名
ADD [CONSTRAINT 约束名] FOREIGN KEY (从表的字段) REFERENCES 主表名(被引用字段) [on update xx][on delete xx];ALTER TABLE empx
ADD FOREIGN KEY (depxid) REFERENCES depx(did);
# (1)先查看从表约束名,删除外键约束
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE table_name = 'empx';
# 删除外键
ALTER TABLE empx
DROP FOREIGN KEY empx_ibfk_1;#(2)查看索引名和删除索引
SHOW INDEX FROM empx;
# 删除索引
ALTER TABLE empx
DROP INDEX depxid;
create table 表名称(字段名 数据类型 default 默认值 ,字段名 数据类型 not null default 默认值,字段名 数据类型 not null default 默认值,primary key(字段名),unique key(字段名)
);create table employee(eid INT primary key,salary DOUBLE(10,2) DEFAULT 2000ename varchar(20) not null,gender char default '男',tel char(11) not null DEFAULT '' #默认是空字符串
);alter table 表名称 modify 字段名 数据类型 default 默认值;
alter table 表名称 modify 字段名 数据类型 default 默认值 not null;ALTER TABLE empx
MODIFY eid INT DEFAULT 0;ALTER TABLE empx
MODIFY ename VARCHAR(20) DEFAULT 'van' NOT NULL;ALTER TABLE empx
MODIFY eid INT;#删除默认值约束,也不保留非空约束
alter table 表名称 modify 字段名 数据类型 ;
#删除默认值约束,保留非空约束
alter table 表名称 modify 字段名 数据类型 not null;
面试1、为什么建表时,加 not null default ‘’ 或 default 0
答:不想让表中出现null值。
面试2、为什么不想要 null 的值
答:(1)不好比较。null是一种特殊值,比较时只能用专门的is null 和 is not null来比较。碰到运算符,通常返回null。
(2)效率不高。影响提高索引效果。因此,我们往往在建表时 not null default ‘’ 或 default 0
面试3、带AUTO_INCREMENT约束的字段值是从1开始的吗? 在MySQL中,默认AUTO_INCREMENT的初始值是1,每新增一条记录,字段值自动加1。设置自增属性(AUTO_INCREMENT)的时候,还可以指定第一条插入记录的自增字段的值,这样新插入的记录的自增字段值从初始值开始递增,如在表中插入第一条记录,同时指定id值为5,则以后插入的记录的id值就会从6开始往上增加。添加主键约束时,往往需要设置字段自动增加属性。
面试4、并不是每个表都可以任意选择存储引擎? 外键约束(FOREIGN KEY)不能跨引擎使用。
MySQL支持多种存储引擎,每一个表都可以指定一个不同的存储引擎,需要注意的是:外键约束是用来保证数据的参照完整性的,如果表之间需要关联外键,却指定了不同的存储引擎,那么这些表之间是不能创建外键约束的。所以说,存储引擎的选择也不完全是随意的。
上一篇:MySQL数据库基本操作
下一篇:java日志