SQL - 复合键


SQL 复合键

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

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

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

备用

我们可以选择 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 列上同时定义主键时,将创建复合键。看下面的查询 -

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 语句生成一条错误消息,指出“重复条目”,如下所示 -

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 列中插入重复值。

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

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

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

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
1 拉梅什 25 德里 1500.00
1 拉梅什 23 科塔 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 和名称 -

ID 姓名 年龄 地址 薪水
1 拉梅什 32 艾哈迈达巴德 2000.00
1 拉梅什 25 德里 1500.00
1 拉梅什 23 科塔 2000.00