Sql 简明教程

SQL - Composite Key

The SQL Composite Key

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

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

让我们用一个例子来理解组合键。假设我们有一个名为 CUSTOMERS 的表,它具有各种字段,如 ID、NAME、AGE、AADHAAR_ID、MOBILE_NO 和 SALARY,如下所示 −

composite

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

Features of Composite Keys

以下是 SQL 组合键的一些重要特性 −

  1. 组合键可以通过组合多个候选键来创建。

  2. 构成组合键的每个候选键(或列)可以是外键,也可以不是外键。但是,如果组合键的所有列本身都是外键,则组合键被称为复合键。

  3. 组合键不能为 NULL;即组合键的任何列都不应包含 NULL 值。

  4. 构成组合键的各个列可以包含重复的值,但是,这些列的组合在整个数据库表中必须是唯一的。

Syntax

以下是创建表时创建 SQL 组合键的语法 −

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

此处, composite_key_name 是用于容纳表中组合键名称的可选占位符。在某些数据库中放弃表中的约束时使用它。

Example

在以下示例中,我们要创建一张具有多个列的 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 是此表组合键的名称。

Output

以下是上述语句的输出 −

Query OK, 0 rows affected (0.02 sec)

Verification

由于我们在 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'

Dropping a Composite Key in MySQL

可以使用 ALTER TABLE…​ DROP 语句从 MySQL 数据库中的表中删除组合键。

Syntax

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

ALTER TABLE table_name DROP PRIMARY KEY;

Example

可以使用以下 SQL 语句从 CUSTOMERS 表中删除 Composite Key 约束:

ALTER TABLE CUSTOMERS DROP PRIMARY KEY;

Output

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

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

Verification

由于我们已经从 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

Dropping a Composite Key in SQL Server

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

Syntax

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

ALTER TABLE table_name DROP composite_key_name;

Example

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

ALTER TABLE CUSTOMERS DROP ck_customers;

Output

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

Commands completed successfully.

Verification

要验证是否已从 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