我最近开始使用MySQL,虽然我已经阅读了一些有关数据库结构的文档,但我无法理解自动增量键以及为什么要使用它们。
有人告诉我:
让我们看一下下面的情况:
tStores tSales tCustomers
---------- ----------- --------------
store_id sale_id customer_id
storeCode store_id
customer_id
首先,我在tStores
中加载了一些可以销售所有商店产品的数据。在我们的业务中,所有商店都有4个字母的代码来标识它们。我可以将其用作主键,但是根据以上建议,我应该使用自动递增的store_id字段吗?
问题是,每次我在tSales
中插入内容时,我都必须回到tStores
并执行类似的操作:
SELECT store_id from tStores WHERE storeCode = @myStoreCode;
假设我正在为每个商店在tSales
中加载成千上万的行,那么使用storeCode
作为主键会不会更有效?
解决这个问题的最有效方法是什么?
答案 0 :(得分:2)
是的,您可以使用storeCode
作为主键,如果可以确保它是唯一的,它将可以使用。然后,您将在其他表上添加外键以建立关系。
自动增量索引的好处是:
关于您的结构,我将对以下几点进行评论:
store_id
和store_code
前面添加了前缀。此前缀不是必需的。为什么不简单地命名列id
和code
。 tSales
上的关系应命名为tStores_id
,以便清楚地指出要引用的表和列。 以下是此示例的SQL代码:
CREATE SCHEMA `myshop` ;
CREATE TABLE `store`.`stores` (
`code` VARCHAR(10) NOT NULL,
PRIMARY KEY (`code`));
CREATE TABLE `store`.`sales` (
`id` INT NOT NULL AUTO_INCREMENT,
`store_code` VARCHAR(10) NOT NULL,
`customer_id` INT NOT NULL,
PRIMARY KEY (`id`));
CREATE TABLE `store`.`customers` (
`id` INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`));
ALTER TABLE `store`.`sales`
ADD INDEX `fk_sales_customers_id_idx` (`customer_id` ASC) VISIBLE;
ALTER TABLE `store`.`sales`
ADD CONSTRAINT `fk_sales_customers_id`
FOREIGN KEY (`customer_id`)
REFERENCES `store`.`customers` (`id`)
ON DELETE CASCADE
ON UPDATE CASCADE;
ALTER TABLE `store`.`sales`
ADD INDEX `fk_sales_stores_code_idx` (`store_code` ASC) VISIBLE;
ALTER TABLE `store`.`sales`
ADD CONSTRAINT `fk_sales_stores_code_id`
FOREIGN KEY (`store_code`)
REFERENCES `store`.`stores` (`code`)
ON DELETE CASCADE
ON UPDATE CASCADE;