Sql 简明教程
SQL - Composite Key
The SQL Composite Key
SQL Composite Key 是可以在表中两个或更多列上定义的关键,用于唯一标识任何记录。它还可以描述为在多个列上创建的主键。
在数据库表没有可以唯一标识表中每一行的单个列的情况下,组合键是必需的。在这种情况下,我们可能需要使用列的组合来确保表中的每条记录都是不同的,并且是可识别的。
让我们用一个例子来理解组合键。假设我们有一个名为 CUSTOMERS 的表,它具有各种字段,如 ID、NAME、AGE、AADHAAR_ID、MOBILE_NO 和 SALARY,如下所示 −
我们可以选择两列 AADHAAR_ID 和 MOBILE_NO,并在它们上定义一个组合键,它可以用于唯一获取 CUSTOMERS 表的记录。
Features of Composite Keys
以下是 SQL 组合键的一些重要特性 −
-
组合键可以通过组合多个候选键来创建。
-
构成组合键的每个候选键(或列)可以是外键,也可以不是外键。但是,如果组合键的所有列本身都是外键,则组合键被称为复合键。
-
组合键不能为 NULL;即组合键的任何列都不应包含 NULL 值。
-
构成组合键的各个列可以包含重复的值,但是,这些列的组合在整个数据库表中必须是唯一的。
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 是此表组合键的名称。
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 数据库中的表中删除组合键。
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 关键字。
Example
假设在 CUSTOMERS 表的 ID 和 NAME 列上创建了一个组合键 "ck_customers",我们将使用以下查询删除它:
ALTER TABLE CUSTOMERS DROP ck_customers;
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 |