【问题标题】:Insert MyISAM key into a INNODB table将 MyISAM 键插入 INNODB 表
【发布时间】:2011-10-17 21:03:26
【问题描述】:

我正在将此表结构用于类似 TAGs 的“毒物”系统

table TAGS

+--------+-------------------+
| alias  | isactive          |  varchar(55), tinyint(1)
+--------+-------------------+
| party  | 1                 |

Engine: MyISAM (because I use some 'autocomplete' using this table (field:alias) for 
a %xxx% search

table TAGREL

+-------------+-------------------+
| tags_alias  | productID         |  varchar(55), int(11)
+-------------+-------------------+
|   party     | 15                |

Engine: InnoDB (i dont need full search here)
This TAGREL table uses tags.alias as FK (on update cascade, on delete cascade)  and 
product id as FK (on update no action, on delete cascade)

我的意思是,整个想法是,当我更新某些标签名称(或删除它)甚至删除产品时,TAGREL 上的关系会自动更新。

但我什至不能在 TAGREL 表中添加一条记录,它表示表 TAGS 上的外键错误,即使我插入的数据是正确的(有效的 TAGS 别名和有效的产品 ID)

我不能在 MySQL 上做这种事情? 唯一的解决方案(因为我需要在 TAGS 表上进行完整搜索)是在我更新某些标签或删除产品时手动更新 tagrel?

谢谢。

【问题讨论】:

    标签: mysql tags innodb myisam


    【解决方案1】:

    您不能在引用MyISAM 表的InnoDB 表中创建外键。

    外键定义需满足以下条件:

    两个表都必须是 InnoDB 表,并且不能是 TEMPORARY 表。

    http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

    所以是的,如果您不更改存储引擎,您将不得不手动强制应用程序代码中的约束。

    LIKE '%XXX%' 搜索不是全文;除非您实际指定了全文索引并且正在使用全文匹配函数,否则您不需要使用 MyISAM 引擎。

    【讨论】:

    • 您好,感谢您提供的信息。另外,感谢您喜欢 %xxx% 的提示。由于我没有在自动完成功能上使用任何匹配项,因此我真的不需要在标签表上使用 MyISAM。但我的产品表是一个 MyISAM(使用全文)。现在使用 products.id 作为外键有问题吗? (没有任何 onupdate、ondelete 操作)
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 2016-11-10
    • 2012-05-15
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多