MySQL - 备用键



表中的备用键只不过是该表中主键的替代。换句话说,它们是当前未选择作为表主键的候选键(但有成为主键的潜力)。因此,它们也可以用于唯一地识别表中的元组(或记录)。

如果一个表只包含一个被视为表主键的候选键,则该表中没有备用键。

在表中设置备用键没有特定的查询或语法。它只是一个普通的列,是作为主键的次要候选。

备用键的特性

尽管备用键不是主键,但它们本身具有一些重要的属性/特性。它们列在下面 -

  • 备用键不允许重复值。
  • 一个表可以有多个备用键。
  • 备用键可以包含 NULL 值,除非显式设置了 NOT NULL 约束。
  • 所有备用键都可以是候选键,但并非所有候选键都可以是备用键。作为主键的候选键不能被视为备用键。

表中键的类型

以下是表中存在的键的列表 -

  • 候选键
  • 主键
  • 备用键
  • 外键

候选键

候选键是超键的子集,用于唯一识别表中的记录。它可以是单个字段或多个字段。表中的主键、备用键、外键都是候选键的类型。

主键

主键是用于从表中检索记录的主要键。它是表中唯一标识数据库表中每个记录的单个列或字段。

它可以使用 PRIMARY KEY 关键字在使用 CREATE TABLE 语句创建表时设置。语法如下 -

CREATE TABLE table_name(
   COLUMN_NAME1 datatype, 
   COLUMN_NAME2 datatype,
   ... 
   PRIMARY KEY(COLUMN_NAME)
);

备用键

备用键是可以作为主键但不是主键的候选键。与主键一样,它也唯一地标识表中字段中的记录以从所述表中检索行元组。表中可以存在一个或多个字段作为备用键。

在数据库表中没有设置备用键的语法。

外键

一个表的主键将是另一个表的外键。在将值插入这些表时,主键字段中的值必须与外键字段中的值匹配;否则,外键列将不接受 INSERT 查询并引发错误。

在表中设置外键字段的语法为 -

CREATE TABLE table_name2(
   ... CONSTRAINT constraint_name 
   FOREIGN KEY (column_name2) 
   REFERENCES table_name1(column_name1)
);

示例

在以下示例中,我们正在 MySQL 数据库中创建一个名为 CUSTOMERS 的示例表 -

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)
);

现在让我们使用如下所示的 INSERT 语句将一些记录插入到此表中 -

INSERT INTO CUSTOMERS VALUES 
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00),
(2, 'Khilan', 25, 'Delhi', 1500.00),
(3, 'Kaushik', 23, 'Kota', 2000.00),
(4, 'Chaitali', 25, 'Mumbai', 6500.00),
(5, 'Hardik', 27, 'Bhopal', 8500.00),
(6, 'Komal', 22, 'Hyderabad', 4500.00),
(7, 'Muffy', 24, 'Indore', 10000.00);

验证

要验证添加到 CUSTOMERS 表的键,让我们使用以下查询显示表定义 -

字段 类型 默认值 额外
ID int PRI NULL
NAME varchar(20) NULL
AGE int NULL
ADDRESS char(25) NULL
SALARY decimal(18, 2) NULL

目前,表中仅在 ID 列上设置了主键。NAME 列充当备用键,因为它只包含与主键列类似的唯一记录。而 ID 和 NAME 都是 CUSTOMERS 表中的候选键。

示例

为了说明外键的使用,我们需要两个表。以下是创建另一个表 ORDERS 并将外键设置为 CUSTOMER_ID 的查询。

CREATE TABLE ORDERS (
   OID INT NOT NULL,
   DATE VARCHAR (20) NOT NULL,
   CUSTOMER_ID INT NOT NULL,
   AMOUNT DECIMAL (18, 2),
   CONSTRAINT fk_customers FOREIGN KEY (CUSTOMER_ID)
   REFERENCES CUSTOMERS(ID)
);

使用 INSERT 语句,将值插入此表,如下所示 -

INSERT INTO ORDERS VALUES 
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);

验证

要验证 ORDERS 表是否引用了 CUSTOMERS 表,我们删除 CUSTOMERS 表而不删除 ORDERS 表。

DROP TABLE CUSTOMERS;

显示以下错误 -

ERROR 3730 (HY000): Cannot drop table 'customers' referenced by a foreign key constraint 'fk_customers' on table 'orders'.

备用键应遵循的规则

以下是将记录插入表时应遵循的备用键规则列表 -

  • 备用键值应唯一。
  • 备用键不能为 NULL。
广告