Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 是否可以删除未使用的ID?_Mysql_Sql_Performance - Fatal编程技术网

Mysql 是否可以删除未使用的ID?

Mysql 是否可以删除未使用的ID?,mysql,sql,performance,Mysql,Sql,Performance,我有一张结构如下的桌子 CREATE TABLE Products ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL, code VARCHAR(30) NOT NULL UNIQUE, warranty TINYINT(1) NOT NULL, producing_country VARCHAR(50), ) 我表中的每种产品都有一个唯一的代码,该产品在库存中也被称为此代码 代码是这样的:(A

我有一张结构如下的桌子

CREATE TABLE Products (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
code VARCHAR(30) NOT NULL UNIQUE,
warranty TINYINT(1) NOT NULL,
producing_country VARCHAR(50),
)
我表中的每种产品都有一个唯一的代码,该产品在库存中也被称为此代码

代码是这样的:(AR-X22,RF-3654,…)

我的问题是我可以删除此表中的ID克隆吗?因为它没有特殊的用途


如果我想在join中使用code列而不是id,是否会有影响?

您的
id
列被指定为您的PK,这意味着它用于唯一标识表中的该行。它看起来像是一个标识类型字段,应该考虑唯一性要求

如果要使用
code
作为新的“id”字段,只要在添加行时确保它是唯一的值,就可以了。只要您更新其他表以使用新的
code
字段,它就不会对联接产生任何影响

我不知道在已经有数据的桌子上摆弄PK有多容易。最好创建一个没有
id
字段的新表,并使用当前表中的数据填充它


如果只是不想看到/处理一个从未使用过的
id
字段,您可以创建一个视图并将该字段从返回中排除。

根据我的理解,您希望从表中删除
id
,并希望在该位置使用
产品代码

表关系基于主键和外键约束,不必每次都将列标识为主键

如果您有产品代码,并且该代码将始终是唯一的且不为空 然后可以使用代码作为表的主键,而不是 不必要的Id列


如果不创建列wither primary,它也将起作用。
谢谢。

一个带有id INT自动递增和主键的表是一个很好的做法

它确保每一行都是唯一的。如果其他程序员来查看您的表,他们会希望看到一个id列

将VARCHAR作为唯一的行键是自找麻烦。有各种各样的编码问题和事情可以使字符串作为标识符不可靠

例如:“ABX-112”和“ABX-112”(隐藏在其中的空间)

若你们只是不想看到ID列,那个么你们可以像下面的“意大利饺子州”那个样创建一个新的视图而不显示它


祝您好运。

您可以将其删除,但我建议您保留它。在连接中使用代码也不会有问题。最好的做法是使用一个id INT AUTO_INCREMENT和主键的表。它确保每一行都是唯一的。如果其他程序员来查看您的表,他们会希望看到一个id列。将VARCHAR作为唯一的行键是自找麻烦。有各种各样的编码问题和事情会使字符串作为标识符变得不可靠。[例如:“ABX-112”和“ABX-112”(隐藏在其中的空格)],如果您不想看到ID列,只需要创建一个新视图而不显示它,请不要这样做。如果你决定改变股票代码系统怎么办?这将是一个痛苦的维护。除了上面提到的点,ID是int,所以只消耗4个字节;另一方面,代码消耗了30多个字节。现在,在许多其他表中,这个PK将作为FK,如果您使用varchar作为PK,那么您的空间消耗将显著增加。同样,如果您有一个持续增加的值,那么更新索引树就更容易了;对于varchar来说并不容易,因为您将有很多中间树插入。当有多个表将其用作FK时,它会变得更重。所以,只有当您在其他表中不将这个varchar字段用作FK时,将它用作PK才是有益的。另外,您要确保输入的代码值不断增加。我从未使用过ID
ALTER TABLE Products DROP COLUMN ID、ADD PRIMARY KEY(ID)、DROP UNIQUE(代码)如果您将产品代码创建为主键,并将其作为索引列,则不会出现性能问题。我不会建议任何人创建没有主键的表。这是一个糟糕的想法,我不是说创建一个没有主键的表。我只是说列名不一定应该是id,它可能是任何东西,我只是说表可以在没有主键的情况下创建,但我也不喜欢这样。“如果不创建列,它也会起作用”似乎表明OP创建表时没有主键。如果这不是你的意思,那么请编辑文本以澄清。如果你认为这不是一个好主意,那你为什么要提到它?仅仅因为这是可能的,并不意味着你应该说出来……因为这是对这个问题的回答,那么无论你在这里说什么,都将被视为建议。如果你反对某事,那么你应该说得很清楚。