標籤:
Mysql叢集建立外鍵,分為四種約束:no action,restrict,cascade,set null。如果表A的主關鍵字是表B中的欄位,則該欄位稱為B的外鍵,表A稱為主表,表B稱為從表。外鍵是用來實現參照完整性的,不同的外鍵不同的外鍵約束方式將可以使兩張表緊密的結合起來,特別是修改或者刪除的級聯操作將使得日常的維護工作更加輕鬆。
CASCADE: 從父表刪除或更新且自動刪除或更新子表中匹配的行。
· SET NULL: 從父表刪除或更新行,並設定子表中的外鍵列為NULL。
· NO ACTION: 在ANSI SQL-92標準中,NO ACTION意味這不採取動作,就是如果有一個相關的外鍵值在被參考的表裡,刪除或更新主要鍵值的企圖不被允許進行(Gruber, 掌握SQL, 2000:181)。 InnoDB拒絕對父表的刪除或更新操作。
RESRICT:同no action。
環境類比:
先來添加兩張表:ta_resource和ta_resourcetime。
DROP TABLE IF EXISTS `ta_resource`;CREATE TABLE `ta_resource` ( `ResourceId` varchar(64) NOT NULL, `ResourcePId` varchar(64) DEFAULT NULL, `ResourceName` varchar(64) DEFAULT NULL, `Type` varchar(64) DEFAULT NULL, `Desc` varchar(512) DEFAULT NULL, `Priority` smallint(6) DEFAULT NULL, `IsFold` varchar(2) DEFAULT NULL, `IsUse` varchar(2) DEFAULT NULL, `URL` varchar(64) DEFAULT NULL, `Icon` varchar(512) DEFAULT NULL, `Css` varchar(64) DEFAULT NULL, `JavaScript` varchar(64) DEFAULT NULL, `TimeSpan` datetime DEFAULT NULL, `IsDefault` varchar(2) DEFAULT NULL, PRIMARY KEY (`ResourceId`)) ENGINE=ndbcluster DEFAULT CHARSET=utf8;-- ------------------------------ Table structure for `ta_resourcetime`-- ----------------------------DROP TABLE IF EXISTS `ta_resourcetime`;CREATE TABLE `ta_resourcetime` ( `TimeId` varchar(64) NOT NULL, `ResourceId` varchar(64) NOT NULL, `ResourceName` varchar(64) DEFAULT NULL, `RoleId` varchar(64) NOT NULL, `RoleName` varchar(64) DEFAULT NULL, `URL` varchar(64) DEFAULT NULL, `StartTime` datetime NOT NULL, `EndTime` datetime NOT NULL, `IsDeleted` varchar(2) DEFAULT NULL, `Desc` varchar(512) DEFAULT NULL, PRIMARY KEY (`TimeId`), KEY `ResourceId` (`ResourceId`), CONSTRAINT `resourceid` FOREIGN KEY (`ResourceId`) REFERENCES `ta_resource` (`ResourceId`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE=ndbcluster DEFAULT CHARSET=utf8;
1、no action時
這兩個表中的外鍵使用的是ON DELETE NO ACTION ON UPDATE NO ACTION
如果更改資料時, ta_resource是主表,ta_resourcetime是從表。
更新資料時:可以修改主表,但是不可以修改從表的資料。
刪除資料時:先刪除從表,再刪除主表。
2、cascade時
叢集搭建完再插入資料庫表時,在on delete 和on update 都使用cascade時遇到了這樣的問題:不能添加外鍵約束。
之前以為是mysql叢集不支援外鍵,在網上查了mysql叢集該版本支援外鍵約束和師哥們討論過這個問題,表示mysql叢集支援外鍵約束。於是經過多次實踐,找到出現這種問題的原因:mysql叢集中支援使用cascade,但是on delete 和on update只能有一個使用cascade,另一個使用no action就可以。
3、記憶體不足
出現的問題:插入不進去資料,經過查詢,是由於記憶體不足
解決方案:
在設定檔config.ini中對記憶體進行設定,主要對這幾項進行設定:
MaxNoOfTables=10240
設定叢集中最大表對象數量
MaxNoOfAttributes=500000
設定可在叢集中定義的屬性數量
MaxNoOfConcurrentTransactions=1000000
用於設定節點內可能的並發事務數
MaxNoOfConcurrentOperations=1000000
設定能同時出現在更新階段或同時鎖定的記錄數
MaxNoOfOrderedIndexes=10240
設定有序索引的總數
如果不配置這些,mysql叢集中會預設記憶體的大小,當記憶體滿了以後就插不進去資料了。
Mysql外鍵約束