【问题标题】:Symfony Insert SQL Error - a foreign key constraint failsSymfony 插入 SQL 错误 - 外键约束失败
【发布时间】:2011-10-04 08:58:14
【问题描述】:

我正在使用固定装置为我的 symfony 项目生成数据,但由于某种原因,不断抛出以下错误:

无法执行 INSERT 语句。 [包装:SQLSTATE [23000]: 完整性约束违规:1452 无法添加或更新子行: 外键约束失败 (meeting.meeting_attendance, 约束 meeting_attendance_FK_1 外键 (meeting_id) 参考meeting_meetings (id))]

我正在寻找错误发生的原因,我使用的是 Symfony 1.4,带有 propel 和 MySQL 数据库。


会议架构和出席架构如下,完整副本http://pastebin.com/HZhaqWSN

  meeting_meetings:
    id: ~
    owner_id: { type: integer, foreignTable: sf_guard_user_profile, foreignReference: user_id, required: true }
    group_id: { type: integer, foreignTable: meeting_groups, foreignReference: id }
    name: { type: varchar, required: true, default: Meeting } 
    completed: { type: boolean, required: true, default: 0 } 
    location: { type: varchar, required: true,  default: Unknown }
    start: { type: integer, required: true }
    length: { type: integer, required: true, default: 60 }
    created_at: ~
    updated_at: ~

  meeting_attendance:
    id: ~
    meeting_id: { type: integer, foreignTable: meeting_meetings, foreignReference: id, required: true }
    user_id: { type: integer, foreignTable: sf_guard_user_profile, foreignReference: user_id, required: true }
    invited: { type: boolean, required: true, default: 0 }
    attending: { type: boolean, required: true, default: 0 }
    apolgies: { type: boolean, required: true, default: 0 }
    attended: { type: boolean, required: true, default: 0 }
    apolgies_comment: { type: varchar(255) }

03_meetings.yml如下

MeetingMeetings:
  PezMeeting:
    owner_id: Pezmc
    completed: 0
    location: Awesome Room
    start: 1310059022
    length: 60

而09_attendance.yml如下:

MeetingAttendance:
  MeetingAttendance1:
    meeting_id: PezMeeting
    user_id: Pezmc
    invited: 1
    attending: 1
    apolgies: 0
    attended: 0
    apolgies_comment: None

我的两个灯具都使用 PHP 随机生成,但我已将它们更改为上述以尝试定位此错误!

我想我一定忽略了一些简单的事情,但我已经尝试调试了一个多小时,而且我束手无策!

有谁知道导致此错误的原因或如何解决?

非常感谢您的宝贵时间,


编辑: 有人建议将所有内容放在一个文件中,我已经这样做了并使用 php 运行该文件(以查看 propel 正在读取的确切内容)。它仍然得到同样的错误:

MeetingMeetings:
  PezMeeting:
    owner_id: Pezmc
    completed: 0
    location: Awesome Room
    start: 1310059022
    length: 60

MeetingItems:
  Item1:
    Value: VfH0qXxGV4Ylb ZtRm DKkDE9dTzlWR z Nm TnNhxVPvZO eOn IM5 v ETOl v 4 xsA7HexNwzB YDvz I uay Sjm3rbAu iaiZIPGv l0oNSFCG To

MeetingAgendas:
  Agenda1:
    MeetingId: PezMeeting
    ItemId: Item1

MeetingActions:
  Action1:
    ItemId: Item1
    MeetingId: PezMeeting
    Due: 1310705295
    Start: 1310358321
    Completed: 1

MeetingAttendance:
  MeetingAttendance1:
    meeting_id: PezMeeting
    user_id: Pezmc
    invited: 1
    attending: 1
    apolgies: 0
    attended: 0

仍然得到:

Unable to execute INSERT statement. [wrapped: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`meeting`.`meeting_agendas`, CONSTRAINT `meeting_agendas_FK_1` FOREIGN KEY (`meeting_id`) REFERENCES `meeting_meetings` (`id`))]  

编辑 2:为表生成的 SQL 在这里:http://pastebin.com/XQmM3k7S(下面的一些表)DROP TABLE IF EXISTS meeting_meetings;

CREATE TABLE `meeting_meetings`
(
    `id` INTEGER  NOT NULL AUTO_INCREMENT,
    `owner_id` INTEGER  NOT NULL,
    `group_id` INTEGER,
    `name` VARCHAR(255) default 'Meeting' NOT NULL,
    `completed` TINYINT default 0 NOT NULL,
    `location` VARCHAR(255) default 'Unknown' NOT NULL,
    `start` INTEGER  NOT NULL,
    `length` INTEGER default 60 NOT NULL,
    `created_at` DATETIME,
    `updated_at` DATETIME,
    PRIMARY KEY (`id`),
    INDEX `meeting_meetings_FI_1` (`owner_id`),
    CONSTRAINT `meeting_meetings_FK_1`
        FOREIGN KEY (`owner_id`)
        REFERENCES `sf_guard_user_profile` (`user_id`),
    INDEX `meeting_meetings_FI_2` (`group_id`),
    CONSTRAINT `meeting_meetings_FK_2`
        FOREIGN KEY (`group_id`)
        REFERENCES `meeting_groups` (`id`)
)Type=InnoDB;

【问题讨论】:

  • 会不会是Awesome Room 中的空间导致INSERT in meeting 表失败?
  • 我很确定 YML 不使用引号或任何东西,它通常只是纯文本,并从模式中确定它应该是什么类型
  • 请注意,您现在遇到的错误与您原来的错误相同;这次是议程,而不是出勤。我猜它与 PezMeeting 的关系在第一个插入时被绊倒了,并且顺序改变了?
  • 观察得很好,我并没有真正注意到,但这是同样的错误,可能我已经改变了文件的顺序,所以首先出现了不同的错误!
  • 是的,我猜这就是可能发生的事情。不过,我基本上没有建议,因为我使用 Doctrine,而不是 Propel...

标签: php mysql symfony1 symfony-1.4 propel


【解决方案1】:

此装置必须在同一个文本文档中以帮助保存!

【讨论】:

    【解决方案2】:

    这些灯具必须在同一个文件中。我的意思是来自 03_meetings.yml 和 09_attendance.yml 的灯具

    我希望这会有用。

    【讨论】:

    • 感谢您的帮助:1:据我所知,根据夹具规范,它是按字母顺序完成的(因此 _09 和 0)2:我已经改变了这个(也在上面的问题)但没有区别还有其他想法吗?
    • 尝试检查哪些记录实际落入数据库。那里有PezMeeting 记录吗?您可以使用php symfony propel:data-dump 将数据转储到 yml 文件中。
    • 数据转储只包含来自其中一个数据库的信息,非常奇怪。这可能是因为错误正在停止转储吗?
    • 不,它不能。所以你有这两个表:meeting_meetingsmeeting_attendance 在不同的数据库中?虽然,这会很奇怪。
    • 它们在同一个数据库中,架构如上(此处为完整副本:pastebin.com/HZhaqWSN
    【解决方案3】:

    在 config/ProjectConfiguration.class.php 中试试这个。然后在数据加载后将其注释掉。

    class ProjectConfiguration extends sfProjectConfiguration
    {
        public function setup()
        {
            // ...
        }
    
        public function configureDoctrine(Doctrine_Manager $manager)
        {
            $manager->setAttribute(Doctrine_Core::ATTR_QUOTE_IDENTIFIER, true);
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2019-03-23
      相关资源
      最近更新 更多