由于mySQL显然不喜欢这样做,那么有什么合适的方法呢?在数据库设计中要么放弃分区,要么放弃外键似乎都不是一个好主意。我猜想这方面一定有解决办法吧?
更新 03/24:
http://opendba.blogspot.com/2008/10/mysql-partitioned-tables-with-trigger.html
谢谢!
由于mySQL显然不喜欢这样做,那么有什么合适的方法呢?在数据库设计中要么放弃分区,要么放弃外键似乎都不是一个好主意。我猜想这方面一定有解决办法吧?
更新 03/24:
http://opendba.blogspot.com/2008/10/mysql-partitioned-tables-with-trigger.html
谢谢!
这取决于分区表中行大小是否是需要进行分区的原因。
如果行大小很小,而分区的原因是行的数量之多,则我不确定您应该怎么做。
如果行大小相当大,那么您是否考虑过以下内容:
设P
为分区表,F
为可能的外键引用表。创建一个新表X
:
CREATE TABLE `X` (
`P_id` INT UNSIGNED NOT NULL,
-- I'm assuming an INT is adequate, but perhaps
-- you will actually require a BIGINT
`F_id` INT UNSIGNED NOT NULL,
PRIMARY KEY (`P_id`, `F_id`),
CONSTRAINT `Constr_X_P_fk`
FOREIGN KEY `P_fk` (`P_id`) REFERENCES `P`.`id`
ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `Constr_X_F_fk`
FOREIGN KEY `F_fk` (`F_id`) REFERENCES `F`.`id`
ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=INNODB CHARACTER SET ascii COLLATE ascii_general_ci
P
创建一个存储过程。您的存储过程应该确保(使用事务),每当向表格P
添加一行时,都会向表格X
添加相应的行。您不能以“正常”的方式向P
添加行!只有使用您的存储过程添加行,才能保证引用完整性得到维护。您可以自由地按照正常方式从P
中删除行。X
具有足够小的行,因此即使它有许多行,您也希望不需要对其进行分区。尽管如此,表格上的索引仍将占用相当大的内存块。P
,当然要查询X
,因为那里才是实际的外键。Constr_X_P_fk
约束并添加第二个存储过程来解决这个问题,其目的是允许在 P
和 X
中删除行。显然,你应该确保任何删除操作都使用存储过程来执行,而不是使用普通的 DELETE
语句。 - Hammerite