Sql 简明教程
SQL - Primary Key
The SQL Primary Key
SQL Primary Key 是一个列(或组合列),可以唯一识别一个数据库表格中的每条记录。主键也能加速数据访问,并且被用来建立表格之间的关系。
让我们想象一下,你正在开发一个叫做“客户管理系统”的应用程序来处理一个仅限会员进入度假胜地的所有客户数据。这些数据可能包括他们的个人信息、分配的会员 ID、他们选择的会员的其他详细信息等。在这个数据库中创建的所有表格,都会使用会员 ID 来区分不同的客户。所以,这个字段将是主键。
下面是 CUSTOMERS 表的图表,这个表格保存了客户的个人详细信息。我们可以看到,主键被定义在 CUST_ID 列。使用这个主键,我们可以找到任何一个客户的记录。
Creating an SQL Primary Key
在使用 CREATE TABLE statement 创建表格时,你可以通过对列名称指定一个 “PRIMARY KEY” 的关键词,向表格的特定列添加主键约束。
Syntax
以下是将表格的列定义为主键的语法:
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY(column_name)
);
Example
在以下示例中,我们正尝试在 SQL 数据库中创建一个叫做 CUSTOMERS 的表格,这个表格有各个字段。在创建表格时,我们将在叫做 ID 的列上添加 “PRIMARY KEY” 约束。
CREATE TABLE CUSTOMERS (
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
Verification
众所周知,主键的值必须是唯一的,所以你不能插入有相同 ID 的记录。在这里,我们将验证对 ID 列创建的约束,通过插入有重复 ID 值的记录。
首先,让我们向 CUSTOMERS 表格中插入一条记录:
INSERT INTO CUSTOMERS VALUES
(3, 'Kaushik', 23, 'Kota', 2000.00);
现在,让我们插入另一条同样的 ID 记录:
INSERT INTO CUSTOMERS VALUES
(3, 'Chaitali', 25, 'Mumbai', 6500.00);
正如我们在上面提到的,如果一个数据库表格中的某个字段/列被定义为主键,那么两条记录不能在这个列/字段中有相同的值。因此,第二个插入语句会产生以下错误:
ERROR 1062 (23000): Duplicate entry '3' for key 'customers.PRIMARY'
类似地,一个主键列不能包含 NULL 值。在这里,我们使用 INSERT 语句向主键列 (ID) 传递了一个 NULL 值。
INSERT INTO CUSTOMERS VALUES
(NULL, 'Komal', 22, 'Hyderabad', 4500.00);
这个语句会产生以下错误:
ERROR 1048 (23000): Column 'ID' cannot be null
Creating Primary Key on an Existing Column
我们也可以使用 ALTER TABLE 语句在表的一个现有列中添加 PRIMARY KEY 约束。
Dropping an SQL Primary Key
如果可以向表中列添加主键约束,你也可以删除它。使用 ALTER TABLE… DROP 语句来执行此操作。
Example
让我们考虑 CUSTOMERS 表,我们在其中一个名为 ID 的列上创建了主键约束。通过执行以下语句,可以从 ID 列删除此约束 −
ALTER TABLE CUSTOMERS DROP PRIMARY KEY;
Verification
由于我们已从名为 ID 的列中删除了主键,因此可以插入具有相同 ID 的多个记录。以下语句插入了四个具有相同 ID 的记录 −
INSERT INTO CUSTOMERS VALUES
(3, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(3, 'Hardik', 27, 'Bhopal', 8500.00 ),
(3, 'Komal', 22, 'Hyderabad', 4500.00 ),
(3, 'Muffy', 24, 'Indore', 10000.00 );
如果验证此表的内容,你将发现多个具有相同 ID 的记录 −
SELECT * FROM CUSTOMERS;
将显示以下形式的表 −
ID |
NAME |
AGE |
ADDRESS |
SALARY |
3 |
Kaushik |
23 |
Kota |
2000.00 |
3 |
Chaitali |
25 |
Mumbai |
6500.00 |
3 |
Hardik |
27 |
Bhopal |
8500.00 |
3 |
Komal |
22 |
Hyderabad |
4500.00 |
3 |
Muffy |
24 |
Indore |
10000.00 |