Mysql外鍵約束

來源:互聯網
上載者:User

標籤:

        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外鍵約束

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.