我正在升级数据库架构。一张桌子分为 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
我想要什么:
- 生成新b_id (auto_increment)
- 从 tableA.name 进口 newTableB.name
- 从 tableA.code 导入的新表C.代码
- 从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
的重复项?