1 CREATE TABLE时添加主键约束
前面我们创建了个人信息数据表Persons
,我们希望每个人的标识符P_Id
都是唯一的。
下面的 SQL 在 个人信息表Persons
创建时,在 P_Id
列上添加PRIMARY KEY
约束:
MYSQL
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
);
执行输出结果
mysql> CREATE TABLE Persons
-> (
-> P_Id int NOT NULL,
-> LastName varchar(255) NOT NULL,
-> FirstName varchar(255),
-> Address varchar(255),
-> City varchar(255),
-> PRIMARY KEY (P_Id)
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> desc Persons;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id | int(11) | NO | PRI | NULL | |
| LastName | varchar(255) | NO | | NULL | |
| FirstName | varchar(255) | YES | | NULL | |
| Address | varchar(255) | YES | | NULL | |
| City | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
我们通过desc table_name
查看建立的数据表Persons
可以发现,P_Id
的Key
属性为PRI,即设定为PRIMARY KEY
。
在SQL Server / Oracle / MS Access中,我们会将约束直接添加在列名后,如下所示:
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
注: 上述语句中NOT NULL
为非空约束,即输入值必须不为空否则会报错。
如需命名并定义多个列的 PRIMARY KEY 约束,请使用下面的 SQL 语法:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
注释:
在上面的实例中,只有一个主键 PRIMARY KEY(pk_PersonID)。然而,pk_PersonID 的值是由两个列(P_Id 和 LastName)组成的。
练习题:创建表时添加主键约束
题目描述:我们希望给lintcode数据库添加学生表students
,学生表有如下信息: 学生标识符id
、姓名name
、邮箱email
、性别gender
、年纪age
、国家country
,其中学生标识符id
设置为唯一标识符
-- write your sql here
2 ALTER TABLE 时添加主键约束
如果我们在创建Persons
时没有指定创建主键约束,此时是否需要删除表再重新写带有主键约束的建表语句呢?这里我们可以使用ALTER TABLE
语句在创建表后添加主键约束。
当表已被创建时,如需在 "P_Id" 列创建 PRIMARY KEY 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
执行输出结果
mysql> CREATE TABLE Persons
-> (
-> P_Id int NOT NULL,
-> LastName varchar(255) NOT NULL,
-> FirstName varchar(255),
-> Address varchar(255),
-> City varchar(255)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> ALTER TABLE Persons
-> ADD PRIMARY KEY (P_Id);
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc Persons;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id | int(11) | NO | PRI | NULL | |
| LastName | varchar(255) | NO | | NULL | |
| FirstName | varchar(255) | YES | | NULL | |
| Address | varchar(255) | YES | | NULL | |
| City | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
如需命名并定义多个列的 PRIMARY KEY 约束,可以使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
注释:
如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
执行输出结果
mysql> CREATE TABLE Persons
-> (
-> P_Id int NOT NULL,
-> LastName varchar(255) NOT NULL,
-> FirstName varchar(255),
-> Address varchar(255),
-> City varchar(255)
-> );
Query OK, 0 rows affected (0.04 sec)
mysql> ALTER TABLE Persons
-> ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName);
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc Persons;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id | int(11) | NO | PRI | NULL | |
| LastName | varchar(255) | NO | PRI | NULL | |
| FirstName | varchar(255) | YES | | NULL | |
| Address | varchar(255) | YES | | NULL | |
| City | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
练习题: 添加主键约束
题目描述:我们现在lintcode
数据库有个学生表students
,但是在创建数据表时,因为数据库工作人员的失误忘记添加了主键约束,现在我们需要对学生表students
添加主键约束,请实现正确的SQL语句。
-- write your sql here
3 撤销主键约束
上面学习了如何添加主键约束,那么删除主键约束呢?
如需撤销 PRIMARY KEY 约束,我们可以通过将上述ALTER TABLE
和DROP
实现:
MYSQL
ALTER TABLE Persons
DROP PRIMARY KEY
执行输出结果
mysql> ALTER TABLE Persons
-> DROP PRIMARY KEY;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc Persons;
+-----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| P_Id | int(11) | NO | | NULL | |
| LastName | varchar(255) | NO | | NULL | |
| FirstName | varchar(255) | YES | | NULL | |
| Address | varchar(255) | YES | | NULL | |
| City | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
通过DESC table_name
我们可以发现,Key列上的约束已经为空了。
在SQL Server / Oracle / MS Access中语法略有不同,具体如下:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
练习题:删除主键约束
题目描述:我们现有数据库lintcode
有学生表students
的主键约束,但是主键约束为学生姓名name
,我们现在希望删除学生表的主键约束并添加新的主键约束到学生id
-- write your sql here