SQL - 主键约束
- SQL 主键
- SQL 主键的属性
- 在 CREATE TABLE 上使用 SQL 主键
- SQL 复合主键
- 在现有列上添加 SQL 主键
- 删除 SQL 主键约束
- 关于 SQL PRIMARY KEY 的重要要点
SQL 主键
SQL 中的 Primary Key 是一个列(或列的组合),用于唯一标识表中的每一行。它确保没有两行在 primary key 列中有相同的值,并且该值不能为 NULL。
每个表只能有一个 primary key,但该 primary key 可以由多个列组成(称为 composite primary key)。
SQL 主键的属性
以下是 SQL PRIMARY KEY 的一些重要属性:
- 它只包含唯一值。
- 它不能为 null。
- 一个表只能有一个 Primary Key。
- Primary key 的长度不能超过 900 字节。
语法
在表中创建或添加 primary key 有多种语法。
为单列创建带有 primary key 的表:
CREATE TABLE table_name (
column1 datatype PRIMARY KEY,
column2 datatype,
column3 datatype
);
为复合 primary key(多个列)创建表:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
PRIMARY KEY (column1, column2)
);
为现有表添加 primary key:
ALTER TABLE table_name ADD CONSTRAINT pk_table PRIMARY KEY (column_name);
在 CREATE TABLE 上使用 SQL 主键
可以使用 CREATE TABLE 语句在创建新表时定义 Primary Key。这确保从表创建之初,该列(或列组)就能唯一标识表中的每一行。
只需在表的特定列名称后指定关键字 "PRIMARY KEY",即可为该表的特定列添加 primary key 约束,如上所示的语法。
示例
在以下示例中,我们尝试在 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) );
以上 SQL 语句的输出如下:
Query OK, 0 rows affected (0.03 sec)
验证
我们知道 primary key 值必须是唯一的,因此不能插入具有相同 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);
如上所述,如果数据库表中的任何字段/列被定义为 Primary Key,则两条记录在该列/字段中不能具有相同的值。因此,第二个 INSERT 语句会产生以下错误:
ERROR 1062 (23000): Duplicate entry '3' for key 'customers.PRIMARY'
同样,primary key 列不能包含 null 值。这里,使用 INSERT 语句我们向 primary key 列 (ID) 传递了一个 NULL 值。
INSERT INTO CUSTOMERS VALUES (NULL, 'Komal', 22, 'Hyderabad', 4500.00);
该语句会产生以下错误:
ERROR 1048 (23000): Column 'ID' cannot be null
SQL 复合主键
复合主键 是由两个或多个列组成的主键。它确保这些列的值组合对每一行都是唯一的,即使单个列的值本身并不唯一。
复合主键通常用于连接表(多对多关系)或当单个列不足以唯一标识记录时。
示例
在这个示例中,我们创建了一个名为 ORDERS 的表,其中 ORDER_ID 和 PRODUCT_ID 的组合构成主键:
CREATE TABLE ORDERS ( ORDER_ID INT NOT NULL, PRODUCT_ID INT NOT NULL, QUANTITY INT, PRIMARY KEY (ORDER_ID, PRODUCT_ID) );
输出结果如下所示:
Query OK, 0 rows affected (0.04 sec)
验证
现在,让我们插入一些记录来查看复合主键的工作方式:
INSERT INTO ORDERS VALUES (101, 5001, 2); INSERT INTO ORDERS VALUES (101, 5002, 1);
这两行都是有效的,因为 ORDER_ID 和 PRODUCT_ID 的组合是唯一的。然而,插入以下记录将导致错误:
INSERT INTO ORDERS VALUES (101, 5001, 3);
我们会得到以下错误:
ERROR 1062 (23000): Duplicate entry '(101, 5001)' for key 'orders.PRIMARY'
现有列上的 SQL 主键
您也可以使用 ALTER TABLE 语句为表的现有列添加 PRIMARY KEY 约束。这在表已经创建但尚未定义主键时非常有用。
示例
在这个示例中,我们为现有 CUSTOMERS 表的 NAME 列添加 PRIMARY KEY 约束:
ALTER TABLE CUSTOMERS ADD CONSTRAINT PRIMARY KEY(NAME);
上述语句的输出如下:
Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0
删除 SQL 主键约束
在 SQL 中,您可以使用 ALTER TABLE 语句从表中删除现有的 主键。这在需要重新定义主键或修改表结构时非常有用。
语法
以下是从表列中删除主键约束的语法:
ALTER TABLE table_name DROP PRIMARY KEY;
示例
假设 CUSTOMERS 表中有一个名为 ID 的列已创建主键约束。您可以通过执行以下语句从 ID 列删除该约束:
ALTER TABLE CUSTOMERS DROP PRIMARY KEY;
上述 SQL 查询产生以下输出:
Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0
验证
由于我们已从名为 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 |
关于 SQL PRIMARY KEY 的重要要点
以下是您应该记住的关于 SQL PRIMARY KEY 约束的重要要点:
- 一个表只能有一个 主键,但该主键可以由一个或多个列组成(复合主键)。
- 主键列 必须包含每个表行的唯一值。
- 主键列 不能包含 NULL 值,确保每一行都可以被识别。
- 创建主键时,大多数数据库系统会 自动为其创建索引,以实现更快的查找。
- 复合主键使用两个或多个列组合,确保行唯一(当单个列不足时)。