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
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
)对应于删除的条目的所有条目也将被自动删除。如果这不是所需的行为,可以采取其他行动。我已经标准化了你的列名。出于便携性的原因,你永远不要使用骆驼大小写栏或表名。而是使用全部小写字母。如果要区分词组中的词,请使用
_
作为词分隔符。您应该有一致的列和索引/键命名约定。每个表中的所有主键都应以相同的方式命名。另外,外键列应该使用一个命名约定,明确标识它们链接的外表和列。这有助于使开发人员在尝试编写/调试/优化查询时更轻松,因为这不一定需要检查实际模式以找出结果。
*'我已经规范化了你的列名。出于便携性的原因...'*您能否引用此消息来源或解释它?我以前没有听说过这个问题。 – Hammerite 2011-06-16 15:13:16
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
。
你能解释为什么第二行的ID是1-2吗?那是第二个ClientID?我试图找出你的逻辑是为了创建UniqueID。 – IAmTimCorey 2011-06-16 14:45:44