通过添加递增的数字使 varchar 字段中的重复项不重复

  • 本文关键字:字段 varchar 添加 数字 mysql sql
  • 更新时间 :
  • 英文 :


我正在升级数据库架构。一张桌子分为 2 个表。这两个表是链接的,链接它们的唯一方法是使用原始表中的 varchar 名称字段。

问题是客户可能有重复的名称,因为名称不是主键/唯一键。

我来这里是为了寻找使这些名称独一无二的想法,以便在将数据移动到两个新的链接表时可以将其用作键。

在我写这篇文章的时候,我想到了将当前的PK连接成名称的想法(如CONCAT(name,id)作为newName)并将其用作键。

还有一个唯一的代码字段,但这只进入其中一个新表。

示例架构:

tableA
a_id INT(11) PRI AUTO_INCREMENT
code VARCHAR(10) UNIQUE 
name VARCHAR(30) NOT NULL
newTableB
b_id INT(11) PRI AUTO_INCREMENT
name VARCHAR(30)
newTableC
c_id INT(11) PRI AUTO_INCREMENT
b_id INT(11) FK->newTableB
code VARCHAR(10) UNIQUE 

我想要什么:

  1. 生成新b_id (auto_increment)
  2. 从 tableA.name 进口 newTableB.name
  3. 从 tableA.code 导入的新表C.代码
  4. 从tableA.a_id进口newTableC.c_id

a_id是另一个保持不变的第四个表中的 FK。完成上述更改后,c_id现在将在第四个表中为有效的 FK。

我的挑战:如何插入这些新表,但仍保留原始名称<->代码<->a_id 关系并将tableA.a_id值传输到newTableC.c_id。不在乎b_id是否获得新的auto_incr值。

不确定我遇到的问题有多清楚,但请随时提出任何问题。

谢谢担

我通常会分几个部分完成这样的任务。首先插入表 b,但将 a 中的 id 字段放在名称列中而不是名称中。然后将数据从表 a 插入到表 c 中。然后,通过连接到 a.id 和 b.name 字段上的表 a 来更新 tableb 名称字段。我不确定您是否可以在 mysql 中的更新中使用联接。应该是编写语句的一种方式,尽管一旦你有数据在那里。

或者,我暂时向表 b 添加一个名为 tableid 的列。然后,我将数据放入表 b 中,包括 a id,并使用它来连接到表 a,以获取表 c 的 b.id 和表 A 数据。完成后,我从表 B 中删除表 A 列。

这个怎么样

CREATE TABLE temp_newTableB AS (SELECT * FROM newTableB);
DELETE FROM newTableB WHERE b_id NOT IN (SELECT b_id FROM temp_newTableB GROUP BY name);
DROP TABLE temp_newTableB ;

但是,是否有任何规则可以决定要在newTableC中保留哪个b_id,因为上述查询将从newTableB中删除一些名为b_id的重复项?

最新更新