1

У меня есть соотношение:Могу ли я вставить значение в Ограничение внешнего ключа дочерней таблицы, которое еще не создано в родительской таблице в качестве первичного ключа?

  • Контакт Таблица - с использованием contactNumber в таблице PK
  • сообщений - с помощью MESSAGEID, как PK
  • Contact_Message - содержит внешние ключи для многих многих картографирования - используется для заполнения InBox


ie One Contact может иметь много сообщений, отправленных/полученных , а одно сообщение может быть отправлено на многие контакты, но получено только от одного контакта
BUT есть возможность отправки/получения сообщения в/из неизвестного номера, которого нет в таблице контактов базы данных.
Поскольку это отношение много-много, неизвестное число необходимо добавить в таблицу Contact_Message, чтобы я мог запросить его.


то, что я ищу, чтобы просто добавить contactNumber (показать в почтовом ящике как есть) в Contact_Message таблице но двигатель SQLite DB генерирует ошибку ограничение внешнего ключа не удалось так, что contactNumber не найдено Контакты Таблица.

....

Более того: объяснить мое беспокойство, я хочу:

  • contactNumber является ВСТАВКА в contact_m2m_message таблице независимо от contactNumber ли это существует в Контакт Стол или нет
  • если контакт DELETEd, соответствующие строки/с в contact_m2m_message не следует удалять; отношение contactNumber и MessageId строки должна сохраняться
  • , если сообщение было удалено, соответствующие строки/с должно быть удалены в contact_m2m_message

.

есть ли решение этой проблемы? .

Вот код:

 
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 
); 

ответ

0

У вас есть требование, что можно иметь Contact_Message отношения без соответствующего контакта.

С помощью внешнего ключа вы вводите другое ограничение, в котором говорится, что все отношения Contact_Message должны иметь соответствующий Contact.

Одно из этих ограничений неверно, и, согласно вашему описанию, это второе. Просто удалите ограничение внешнего ключа.

Если вы все еще хотите иметь действие ON UPDATE CASCASE, вы должны реализовать его с помощью trigger.