SQL - 复合主键



SQL 复合主键

SQL 的复合主键是在表中两个或多个列上定义的键,用于唯一标识任何记录。它也可以被描述为主键在多个列上创建。

在数据库表中没有单个列可以唯一标识表中每一行的场景下,复合键是必要的。在这种情况下,我们可能需要使用列的组合来确保表中的每个记录都是不同的和可识别的。

让我们用一个例子来理解复合键。假设我们有一个名为 CUSTOMERS 的表,其中包含各种字段,如 ID、NAME、AGE、AADHAAR_ID、MOBILE_NO 和 SALARY,如下所示:

Alternate

我们可以选择 AADHAAR_ID 和 MOBILE_NO 两个列,并在它们上面定义一个复合键,它可以用来唯一地获取 CUSTOMERS 表的记录。

复合键的特征

以下是 SQL 复合键的一些重要特征:

  • 可以通过组合多个候选键来创建复合键。
  • 构成复合键的每个候选键(或列)可以是也可以不是外键。但是,如果复合键的所有列本身都是外键,则该复合键称为组合键。
  • 复合键不能为 NULL;即复合键的任何列都不能包含 NULL 值。
  • 构成复合键的各个列可以包含重复值,但是这些列的组合在整个数据库表中必须是唯一的。

语法

以下是创建表时创建 SQL 复合键的语法:

CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   CONSTRAINT composite_key_name,
   PRIMARY KEY(column_name)
);

这里,composite_key_name 是可选占位符,它保存表中复合键的名称。它用于在某些数据库中从表中删除约束时使用。

示例

在以下示例中,我们正在创建一个名为 CUSTOMERS 的表,其中包含多个列。当在 ID 和 NAME 列上一起定义 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),       
   CONSTRAINT ck_customers 
   PRIMARY KEY (ID, NAME)
);

其中,ck_customers 是该表的复合键的名称。

输出

以下是上述语句的输出:

Query OK, 0 rows affected (0.02 sec)

验证

由于我们在 CUSTOMERS 表的 ID 和 NAME 列上创建了一个复合键,因此这些列中值的组合不能重复。为了验证它,让我们在 CUSTOMERS 表中插入两条具有相同值的记录:

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(1, 'Ramesh', 25, 'Delhi', 1500.00 );

您可以观察到第二个 INSERT 语句生成一条错误消息,提示“Duplicate entry”(重复条目),如下所示:

ERROR 1062 (23000): Duplicate entry '1-Ramesh' for key 'customers.PRIMARY'

在 MySQL 中删除复合主键

您可以使用ALTER TABLE... DROP 语句从 MySQL 数据库中的表中删除复合键。

语法

以下是 MySQL 中删除复合键的语法:

ALTER TABLE table_name DROP PRIMARY KEY;

示例

使用以下 SQL 语句,我们可以从 CUSTOMERS 表中删除复合键约束:

ALTER TABLE CUSTOMERS DROP PRIMARY KEY;

输出

上述 SQL 语句产生以下输出:

Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

验证

由于我们已从 CUSTOMERS 表中删除了复合键,因此现在您可以在 ID 和 NAME 列中插入重复值。

让我们在 CUSTOMERS 表中插入两条具有相同 ID 和 NAME 的记录:

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 25, 'Delhi', 1500.00 ),
(1, 'Ramesh', 23, 'Kota', 2000.00 );

如果您检索 CUSTOMERS 表的内容,您可以找到具有相同 ID 和 NAME 的记录,如下所示:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
1 Ramesh 25 Delhi 1500.00
1 Ramesh 23 Kota 2000.00

在 SQL Server 中删除复合主键

在 SQL Server 中,我们有不同的语法来删除表的复合键。语法几乎相同,但我们只需要指定复合键名称才能删除它,而不是关键字 PRIMARY KEY。

语法

以下是 SQL Server 中删除复合键的语法:

ALTER TABLE table_name DROP composite_key_name;

示例

假设在 CUSTOMERS 表的 ID 和 NAME 列上创建了一个复合键“ck_customers”,我们将使用以下查询来删除它:

ALTER TABLE CUSTOMERS DROP ck_customers;

输出

当我们执行上述查询时,复合键将被删除。

Commands completed successfully.

验证

要验证我们是否已从 CUSTOMERS 表中删除了复合键,请使用以下查询在 ID 和 NAME 列中插入重复值:

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 25, 'Delhi', 1500.00 ),
(1, 'Ramesh', 23, 'Kota', 2000.00 );

正如我们在下表中看到的,这两个客户都具有相同的 ID 和 NAME:

ID NAME AGE ADDRESS SALARY
1 Ramesh 32 Ahmedabad 2000.00
1 Ramesh 25 Delhi 1500.00
1 Ramesh 23 Kota 2000.00
广告