MySQL表更新

时间:2011-06-16 14:42:37

标签: mysql sql

我有两张桌子,而我想做的事情很简单,但同时又很复杂 - 如果有人能帮助我那就太棒了。

我有以下表格......

Table A
ClientID
1
2
3

Table B
ClientID        ID
1               
1
3

表B在表中有ClientID,表A也是如此。所以它们链接起来,我需要做的是将ID更新为唯一引用。

即。 clientID-UniqueID。例如,如果我更新了表B,我希望它看起来像这样(顺序)

Table B
ClientID            ID
1                   1-1
1                   1-2
3                   3-1

2 个答案:

答案 0 :(得分:5)

没有任何理由这样做。只需使用table_b.id上的标准自动增量主键。

使用InnoDB,架构看起来像:

CREATE TABLE `table_a` (
  `id` UNSIGNED integer AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE `table_b` (
  `id` UNSIGNED integer AUTO_INCREMENT,
  `client_id` UNSIGNED integer,
  PRIMARY KEY (`id`),
  KEY (`table_a_id`),
  CONSTRAINT `table_b_table_a_id_table_a_id` 
    FOREIGN KEY (`table_a_id`)
    REFERENCES `table_a` (`id`)
    ON DELETE CASCADE
) ENGINE=InnoDB;

你会注意到一些关键点:

  • InnoDB支持外键和相关的完整性强制执行操作。通过table_b ON DELETE CASCADE使用外键约束,table_a随时删除条目table_btable_a_idClientID的所有条目均为_({{1}}对应于已删除的条目也将自动删除。如果这不是期望的行为,则可以采取其他行动。

  • 我已将您的列名标准化。出于便携性原因,您不应使用驼峰式列或表名。而是全部使用小写。如果您想区分短语中的单词,请使用{{1}}作为单词分隔符。

  • 您应该具有一致的列和索引/键命名约定。每个表中的所有主键都应以相同的方式命名。此外,外键列应使用命名约定,该约定清楚地标识它们链接到的外部表和列。这有助于在尝试编写/调试/优化查询时使开发人员更容易,因为这不一定需要检查实际的模式来解决问题。

答案 1 :(得分:0)

您可能需要尝试以下内容(假设ID已经是B中的列):

ALTER TABLE B MODIFY COLUMN ID INT AUTOINCREMENT, ADD PRIMARY KEY (ClientID, ID)

如果ID中尚未B,您可以使用

ALTER TABLE B ADD COLUMN (ID INT AUTOINCREMENT), ADD PRIMARY KEY (ClientID, ID)

我认为这会使ID为每个不同的ClientID都有一个单独的增量计数器。