2012-07-24 74 views
0

我有一個與我的用戶表作爲外鍵的定義關係,但它們不一定需要設置。即一定不能有相關記錄。不能使外鍵字段爲空可以用Sequel Pro

在我的MySQL編輯器(Sequel Pro)中,我無法讓addressId「allow null」。它忽略了輸入。我正在使用最新版本。

當我在用戶表中創建一個沒有addressId的新條目時,它會顯示「無法添加或更新子行:外鍵約束失敗......」。但我希望能夠添加一個沒有地址的用戶!那可能嗎?

或者我應該簡單地刪除外鍵?那有什麼缺點?

CREATE TABLE `User1` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(200) DEFAULT NULL, 
    `email` varchar(255) DEFAULT NULL, 
    `password` char(32) DEFAULT NULL, 
    `addressId` int(11) NULL DEFAULT '0', 
    `created` datetime DEFAULT NULL, 
    `activated` datetime DEFAULT NULL, 
    `lastLogin` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`,`addressId`), 
    KEY `FK_User_Locale` (`localeId`), 
    KEY `FK_User_Address` (`addressId`), 
    CONSTRAINT `FK_User_Address` FOREIGN KEY (`addressId`) REFERENCES `Address` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
+0

我會刪除外鍵約束。國際海事組織使用數據庫來強制執行參照完整性是浪費資源。另外,當你將列和表重命名爲惡夢時。編寫強大的服務器腳本是一種更好的方法。 – dano 2012-07-24 22:51:12

+0

@dano不應該重命名列和表。更糟糕的噩夢是學習你認爲強大的腳本實際上很薄弱,並且你的數據失去了完整性。 – 2015-05-12 00:09:19

回答

1

爲什麼不通過設置爲foreign_key_checks = 0來禁用foreign_key_checks

否則,你可能會DROP約束,如果它不符合你的要求!

如果設置爲1(缺省值),則檢查InnoDB表 的外鍵約束。如果設置爲0,它們將被忽略。禁用外鍵 檢查對於以不同於其父/子關係所需的 順序重新加載InnoDB表很有用。

+0

那麼,僅僅刪除外鍵聲明就沒有多大意義了? – preyz 2012-07-25 13:26:29

+0

是的,你的願望!如果你不需要任何參照完整性,你可以放棄它。無論如何,我已經相應地編輯了我的答案。 – Jacob 2012-07-25 15:47:48