字段约束条件
约束条件与数据类型的宽度一样,都是可选参数
作用:用于保证数据的完整性和一致性
非空约束:
not null:表示不可以为空--不能是null但可以是""。默认是可以为null。用在字段后
默认值
default x :指定x为默认值。默认没有默认值。用在字段后
主键约束:一个表只可以有一个主键
primary key:设置为主键,不可重复,不可为空。用在字段后
组合主键:联合主键就是用2个或2个以上的字段组成主键。用这个主键包含的字段作为主键,这个组合在数据表中是唯一。
写在建表最后 primary key (字段1,字段2)
自增长:
auto_increment:标识该字段的值自动增长(整数类型,而且为主键)。用在字段后
初始值:
在创建完表之后修改自增字段的起始值: alter table 表名 auto_increment=N;
创建表时指定auto_increment的初始值: auto_increment=N;注意初始值的设置为表选项,应该放到括号外
mysql> create table cc(id int primary key auto_increment)auto_increment=5; Query OK, 0 rows affected (0.32 sec) mysql> insert into cc values (),(),(); Query OK, 3 rows affected (0.05 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select *from cc; +----+ | id | +----+ | 5 | | 6 | | 7 | +----+
步长:
设置自增列的步长,可以分为全局级别和会话级别,如果是会话级别,那么当用户新建一个会话的时候,那么步长又回到了全局级别,所mysql的步长跟sqlserver的步长有很大的不同,mysql不能设置为表级别的步长!!
mysql> show variables like 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | --步长 | auto_increment_offset | 1 | -- mysql起始值,不是单独一个表的 +--------------------------+-------+
修改回话级别
mysql> set @@auto_increment_increment=3; Query OK, 0 rows affected (0.00 sec) mysql> show variables like 'auto_incre%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 3 | | auto_increment_offset | 3 | +--------------------------+-------+ mysql> insert into dd values (),(),(); Query OK, 3 rows affected (0.07 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> select * from dd; +----+ | id | +----+ | 3 | | 8 | | 13 | -- 除了这里步长都变为了3 | 18 | | 21 | | 24 | +----+ 重新登录之后 mysql> show variables like 'auto_incre%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 5 | | auto_increment_offset | 3 | +--------------------------+-------+
修改全局
set global auto_increment_increment=5; -- 可同样设置初始值 -- 需重新登录,之后创建的的步长都为5
如果auto_increment_offset的值大于auto_increment_increment的值,则auto_increment_offset的值会被忽略
唯一约束
unique:表示该字段的值不可以重复。用在字段后
组合:表示组合起来的字段不能同时重复。用在建表最后 unique 别名(字段名1,字段名2)
unsigned 表示数字类型没有符号,默认有符号
外键约束
constraint 外键名 foreign key (字段名) references 库名.表名(字段名) on delete cascade
把一个表的一个字段关联到另一个表的字段。
比如有一个员工信息表,和一个部门表
+---------+-----------+ | dept_id | dept_name | +---------+-----------+ | 1 | 财务部 | | 2 | 普工 | +---------+-----------+
部门表
+----+--------+---------+ | id | name | dept_id | +----+--------+---------+ | 1 | 熊大 | 1 | | 2 | 熊二 | 1 | +----+--------+---------+
将员工所属部门关联到部门表里,节省空间。员工所属部门只能从部门表里选择
-- 部门表 create table dept( dept_id int(30) not null auto_increment primary key, dept_name varchar(255) not null ); -- 员工表 create table emp( id int(10) not null auto_increment primary key, name varchar(50) not null, dept_id int(10) not null, constraint f_key foreign key (dept_id) references db2.dept(dept_id) on delete cascade );
默认情况下添加外键约束后,部门表中的数据如果被员工表中的数据使用了,则不可以删除
级联删除:删除主表的数据时,关联的从表数据也删除。在建立外键约束的后面增加on delete cascade
设置为null:删除主表的数据时,将从表的关联列的值设置为null。在建立外键约束的后面增加on delete set null
警告:进公司工作时,最好问清楚,表的主外建设计是否需要添加约束?