gpt4 book ai didi

mysql - 什么时候使用自增键?

转载 作者:可可西里 更新时间:2023-11-01 08:23:33 24 4
gpt4 key购买 nike

我最近开始使用 MySQL,虽然我阅读了一些关于数据库结构的文档,但我无法理解自动递增键以及为什么要使用它们。

有人告诉我:

  • 最好使用数字而不是文本作为主键,
  • 最好使用没有任何商业意义的 key

让我们看看下面的情况:

 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 作为主键不是更有效吗?处理此问题的最有效方法是什么?

最佳答案

是的,你可以使用 storeCode 作为主键,如果你能确保它是唯一的,它就可以工作。然后您将在其他表上添加外键以建立关系。

自增索引的好处是:

  • 它通常比其他列类型上的任何索引都快
  • 通常是一些框架推荐的(比如PHP中的Laravel)

关于你的结构我会评论几点:

  • 您有混合大小写的列/表。在 MySQL 上工作时,尤其是在不同操作系统 (Windows/Linux) 上使用时,我总是建议对模式、表和列使用小写名称。
  • 您在 store_idstore_code 前面添加了前缀。这个前缀不是必需的。为什么不简单地命名列 idcode
  • 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;

关于mysql - 什么时候使用自增键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55002774/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com