导言
上一节提到了MySQL的主键约束,这一节再来讲一讲MySQL的其他约束。本节将针对MySQL的主键约束、唯一约束、默认约束、非空约束进行讲解。
1. 主键约束
主键约束的关键字为PRIMARY KEY,主键约束所约束的是一个列或多个列的组合。被约束的一列或多列具有唯一性,可以通过主键来标识某一行。主键约束遵循以下规则:
- 主键值必须唯一,且不为NULL
- 每个表中只能定义一个主键
- 复合主键需要满足最小化原则,即复合主键不能包含多余的、不必要的列。
如果主键为表中的某一列而非多列,则可以直接用primary key修饰该字段。
CREATE TABLE IF NOT EXISTS emp_primary_key_test (
id INT(11) NOT NULL PRIMARY KEY,
name VARCHAR(50)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
也可以直接用PRIMARY KEY单独指定主键:
CREATE TABLE emp_primary_key_test (
id int(11) NOT NULL,
name varchar(50) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果需要使用复合主键,直接在PRIMARY KEY后的括号中指定多个即可,注意用逗号分割。
2. 非空约束
非空约束,即指定表中的字段不能为空,用NOT NULL关键字指定。
CREATE TABLE emp_not_null_test (
id int(11) NOT NULL,
name varchar(50) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上述SQL语句指定了name字段不为空。
mysql> insert into emp_not_null_test(id,name) values (1,NULL);
1048 - Column 'name' cannot be null
3. 默认约束
默认约束,即用来指定表中某列的默认值,用DEFAULT关键字指定。
CREATE TABLE emp_default_test (
id int(11) NOT NULL,
name varchar(50) DEFAULT '菜虚鲲',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
直接插入两条不带name的数据
mysql> insert into emp_default_test(id) values (1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
name字段被指定了默认值
mysql> select * from emp_default_test;
+----+-----------+
| id | name |
+----+-----------+
| 1 | 菜虚鲲 |
| 2 | 菜虚鲲 |
+----+-----------+
2 rows in set (0.00 sec)
4. 唯一约束
唯一约束,即要求某一列唯一,允许为空,但只能出现一个空值,用UNIQUE关键字指定。
假设要求不能重名:
CREATE TABLE emp_unique_test (
id int(11) NOT NULL,
name varchar(50) UNIQUE,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
先插入一条名为’哈哈’的数据
mysql> insert into emp_unique_test(id,name) values(1,'哈哈');
Query OK, 1 row affected (0.00 sec)
再插入一条名为’哈哈’的数据
mysql> insert into emp_unique_test(id,name) values(2,'哈哈');
1062 - Duplicate entry '哈哈' for key 'name'