MySQL表更新

问题描述:

我有两张表,我试图做的事很简单,但同时又相当复杂 - 如果有人能帮助我,那将会很棒。MySQL表更新

我有以下表...

Table A 
ClientID 
1 
2 
3 

Table B 
ClientID  ID 
1    
1 
3 

表B在表中的客户端ID的也是如此表A.于是他们联系起来,我需要做的是更新ID为独特的参考。

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

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

你能解释为什么第二行的ID是1-2吗?那是第二个ClientID?我试图找出你的逻辑是为了创建UniqueID。 – IAmTimCorey 2011-06-16 14:45:44

Theres没有任何理由这样做。只需要我们在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_b中的table_a_id(以前的ClientID)对应于删除的条目的所有条目也将被自动删除。如果这不是所需的行为,可以采取其他行动。

  • 我已经标准化了你的列名。出于便携性的原因,你永远不要使用骆驼大小写栏或表名。而是使用全部小写字母。如果要区分词组中的词,请使用_作为词分隔符。

  • 您应该有一致的列和索引/键命名约定。每个表中的所有主键都应以相同的方式命名。另外,外键列应该使用一个命名约定,明确标识它们链接的外表和列。这有助于使开发人员在尝试编写/调试/优化查询时更轻松,因为这不一定需要检查实际模式以找出结果。

+1

*'我已经规范化了你的列名。出于便携性的原因...'*您能否引用此消息来源或解释它?我以前没有听说过这个问题。 – Hammerite 2011-06-16 15:13:16

+0

mysql在区分大小写的系统(即* nix)和大小写不敏感的系统(windows)时区分大小写。如果您需要同时支持或不能100%确定最终安装目标是什么,请避免使用任何种类的混合大小写(骆驼或其他)来表名和列名。虽然我通常只支持nix,但我只是确保我使用的惯例是为了以防万一,因为它只是让一个约定变得更容易,并且不会一直切换它。 – prodigitalson 2011-06-16 15:32:19

你可能想尝试像以下(假设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