【问题标题】:propel:diff task generates unnecessary SQL sentences for all fields/tablespropel:diff 任务为所有字段/表生成不必要的 SQL 语句
【发布时间】:2023-03-04 08:32:01
【问题描述】:

我在 MySQL 5.1 上使用 Symfony 1.4 和 Propel 1.6。

每次我对schema.xml做些小改动(比如在一张表中增加一个字段),我都是用来执行的:

php symfony propel:build-all --classes-only --env=dev
php symfony propel:diff --env=dev
php symfony propel:up --env=dev

在第二步中,任务总是为alter table changefieldfieldinteger not null 类型的所有表中的所有字段生成 SQL 语句,或者删除/创建根本没有改变的约束:

ALTER TABLE `pedido_linea` CHANGE `id` `id` INTEGER(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `product` CHANGE `norma_id` `norma_id` INTEGER(11);
...
ALTER TABLE `pedido_linea` DROP FOREIGN KEY `pedido_linea_FK_2`;
ALTER TABLE `pedido_linea` ADD CONSTRAINT `pedido_linea_FK_2`
    FOREIGN KEY (`product_id`)
    REFERENCES `product` (`id`)
    ON UPDATE RESTRICT
    ON DELETE RESTRICT;

Propel 似乎没有正确读取 MySQL 的字段属性并将它们视为已更改。这很烦人,因为我必须扫描所有生成的脚本以检查它是否是我想要的。有解决办法吗?

【问题讨论】:

    标签: symfony1 symfony-1.4 propel


    【解决方案1】:

    Mysql 不为外键提供 RESTRICT 约束,因为这与 NO ACTION 相同或没有定义约束(参见http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

    删除 ON UPDATE 和 ON DELETE 行,你应该会很好

    【讨论】:

    • 这不是重点,因为它发生在所有约束上,包括 RESTRICT、SETNULL 或 CASCADE。关键是推进解释了所有字段都没有变化:
    猜你喜欢
    • 2012-04-07
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多