分区具有外键的mySQL表?

Ind*_*ial 5 mysql partitioning foreign-keys

什么是合适的方法,因为mySQL显然不喜欢这个.从数据库设计中留下分区或外键对我来说似乎不是一个好主意.我猜这有一个解决方法吗?

更新03/24:

http://opendba.blogspot.com/2008/10/mysql-partitioned-tables-with-trigger.html

如何在分区时处理外键

谢谢!

Ham*_*ite 2

这取决于分区表中行的大小在多大程度上是需要分区的原因。

如果行大小很小并且分区的原因是行数过多,那么我不确定您应该做什么。

如果行大小相当大,那么您是否考虑过以下事项:

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
Run Code Online (Sandbox Code Playgroud)

最重要的是,创建一个存储过程来将行添加到表中P。您的存储过程应该确保(使用事务)每当将一行添加到 table 时P,相应的行就会添加到 table XP您不能允许以“正常”方式添加行!只有继续使用存储过程添加行,才能保证引用完整性得到维护。不过,您可以P按照正常方式自由删除。

这里的想法是,您的表X具有足够小的行,您希望不需要对其进行分区,即使它有很多行。我想,表上的索引仍然会占用相当大的内存块。

如果您需要查询P外键,您当然会查询X,因为那是外键实际所在的位置。

  • 我刚刚查看了有关分区限制的 MySQL 手册页,发现分区表上不仅不能有外键,而且也不能有外键*指向*分区表。这意味着上面的内容还不够好。您可以通过删除(显然)约束“Constr_X_P_fk”并添加第二个存储过程来修复它,该存储过程的目的是允许删除“P”和“X”中的行。显然,您应该确保任何删除都是使用存储过程执行的,而不是使用普通的“DELETE”语句。 (3认同)