#约束
#MySQL数据库的约束分为4种,
#1.主键约束
#2.外键约束
#3.唯一键约束
#4.非空约束
#MySQL数据库不支持检查约束,但是提供了check的代替方式
#mysql数据库约束名默认与字段名相同。通过select keys from 表名 或者 show index from 表名;查看 ;
#主键约束:主键约束列不允许重复,不允许为空值,每个表只允许有一个字段是主键。
#主键可以是单个字段,也可以是多个字段组成联合主键。
#建表时创建主键
#单个字段主键
create tabletest(
id int primary key comment '主键字段',
name varchar(32),
age tinyint
);
#联合主键
create tabletest2(
id int comment '主键字段',
name varchar(20),
age tinyint,
primary key(id, name)
);
#该已有的表中字段添加主键
#语法:alter table 表名 add primary key(字段1,字段2...);
#方式一
alter tabletest2 add primary key(id,name);
alter tabletest2 add primary key(id);
#方式二
alter tabletest2 add constraint primary key(id);
#删除主键
#语法:alter table 表名 drop primary key;
alter tabletest2 drop primary key;
#唯一键约束:
#指定的table的列或者列组合不能重复,保证数据的唯一性。
#唯一约束不允许出现重复值,但是可以有多个null。
#同一个表可以有多个唯一约束,多个列组合的约束。
#创建表时,用户名,密码不能重复
create tabletemp(
id int not null,
name varchar(12),
password varchar(12),
constraintun_temp_name_pwd unique(name, password)
#简写 unique(字段1,字段2...)
);
#给已有的表添加唯一键约束
#语法:alter table 表名 add unqiue(字段名1,字段名2...);
#方式一
alter tabletest add unique(name);
#方式二
alter tabletest add constraint unique(name);
#修改唯一键约束
alter tabletemp modify name varchar(12) unique;
#删除唯一键约束
#语法: alter table 表名 drop index 约束名;
alter tabletemp drop indexun_temp_name_pwd;
#查看表中约束的名字
show keys fromtemp;
show create tabletemp;
show index fromtest2;
#外键约束
#外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或者是两个表的两个字段之间的参照关系。
#在建表时
#添加外键
create tablestu(
sid int primary key,
sname varchar(20)
);
create tablesocre1(
sid int,
score double,
constraintfk_stu_score1_sid foreign key(sid)
referencesstu(sid)
);
#给已经存在的表添加外键约束
#语法:alter table 外键表名 add constraint 外键名 foreign key(外键字段名)
# refenences 主表名(主键名);
create tablestu1(
sid int primary key,
sname varchar(20)
);
create tablesocre2(
sid int,
score double
);
alter tablesocre2 add constraintfk_socre1_stu1_sid foreign key(sid)
referencesstu1(sid);
show create tablesocre1;
#非空约束 not null
#建表时 直接添加在字段后面。
create tablesocre2(
sid int,
score double not null
);
#给已有的表中字段添加非空字段
#语法:alter table 表名 change 新字段名 新字段名 数据类型 约束;
alter tablesocre2 change score score double not null;
show create tablesocre2;
#检查约束
# mysql暂不支持,但提供了代替check的方式
#enum(值1,值2,值3) 单选
#set(值1,值2,值3) 多线
create tabletest4(
id int primary key auto_increment,
sex varchar(50) check(sex in('男','女','女博士'))
);
#check关键字虽然可以正常写入,但并没有效果。
create tabletest5(
id int primary key auto_increment,
sex varchar(50) #enum('男','女','女博士')
);
alter tabletest5 add sex2 enum('男','女','女博士');
insert intotest5 values(default, "女", "女博士");
#[01000][1265] Data truncated for column 'sex2' at row 1
insert intotest5 values(default, "女", "女人");
create tabletest6(
id int primary key auto_increment,
sex varchar(50),
sex2 set('男','女','女博士')
);
insert intotest6 values(default,'男','男,女');
select* fromtest6;