我可以在子表的外键约束中插入一个值,该值尚未在父表中创建为主键吗?

时间:2014-10-14 00:37:04

标签: android sqlite foreign-key-relationship referential-integrity

我有一个关系:

  • 联系表 - 使用contactNumber作为PK
  • 消息表 - 使用messageID作为PK
  • Contact_Message - 包含多对多映射的外键 - 用于填充收件箱


即一个联系人可以发送/接收许多消息 并且可以将一条消息发送给许多联系人,但只接收一个联系人
但是有可能向/不是数据库的联系表中的未知号码发送/接收消息。
由于它是多对多的关系,因此需要将未知数量添加到Contact_Message表中,以便我可以查询它。

<小时/> 我正在寻找的只是在Contact_Message表中添加contactNumber(在收件箱中显示) SQLite数据库引擎生成错误外键约束失败,因为该contactNumber在联系表中找不到。

...

此外:解释我的担忧,我想:

  • contactNumber contact_m2m_message 表中的 INSERT ,无论 contactNumber 是否存在于联系人< / strong>表格与否
  • 如果联系人已被删除,则 contact_m2m_message 中的相关行不应删除;相关的 contactNumber messageID 行应该保留
  • 如果邮件被删除,则应在 contact_m2m_message
  • 中删除相关的行/ s

有没有解决这个问题的方法?

以下是代码:

CREATE TABLE contact (
   contactNumber Numeric PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, 
   contactName TEXT NOT NULL
);

CREATE TABLE message (
   msgID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE,
   messageContent TEXT NOT NULL
);

CREATE TABLE contact_m2m_message (
   contactNumber NUMERIC NOT NULL REFERENCES contact ( contactNumber ) 
   ON DELETE NO ACTION ON UPDATE CASCADE, 

   messageID INTEGER NOT NULL REFERENCES message ( msgID ) 
   ON DELETE CASCADE ON UPDATE CASCADE
);

1 个答案:

答案 0 :(得分:0)

您要求可以在没有相应联系人的情况下建立Contact_Message关系。

使用外键,您引入另一个约束,该约束表示所有Contact_Message关系必须具有相应的联系人。

其中一个约束是错误的,根据你的描述,它是第二个。 只需删除外键约束。

如果您仍想要ON UP UPDATE CASCASE操作,则必须使用trigger实现它。