0

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

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

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

在我写这篇文章时,我想到了将当前的 PK 连接到名称(如在 CONCAT(name,id) as 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 导入的 newTableC.code
  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。价值观。

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

谢谢丹

4

2 回答 2

1

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

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

于 2012-04-11T21:51:25.470 回答
0

这个怎么样

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 ;

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

于 2012-04-11T21:51:06.373 回答