mysql 字段屬性

2021-10-12 11:49:13 字數 2347 閱讀 1820

外來鍵auto_increment

列的預設值為null,null的含義是這個列的值還沒有被設定

not null 必須要有 default

unique的基礎就不說了,下面記錄一些重點

唯一性約束強制在指定的列上建立乙個唯一性索引。預設建立唯一性的非聚簇索引,但是也可以指定所建立的索引是聚簇索引

unique列在插入重複資料的時候會報錯,但還是會使auto_increment自動增長

1、insert ignore

insert ignore會忽略資料庫中已經存在的資料(根據主鍵或者唯一索引判斷),如果資料庫沒有資料,就插入新的資料,如果有資料的話就不插入這條資料.

2、replace into

replace into 首先嘗試插入資料到表中。 如果發現表中已經有此行資料(根據主鍵或者唯一索引判斷)則先刪除此行資料,然後插入新的資料,否則,直接插入新資料。

**3、insert … on duplicate key update **

如果在insert into 語句末尾指定了on duplicate key update,並且插入行後會導致在乙個unique索引或primary key**現重複值,則在出現重複值的行執行update;如果不會導致重複的問題,則插入新行,跟普通的insert into一樣。

如果有新記錄被插入,則受影響行的值顯示1;如果原有的記錄被更新,則受影響行的值顯示2;如果記錄被更新前後值是一樣的,則受影響行數的值顯示0

如下:如果表中已經存在這條記錄,就將其score update為100。

但是當資料多了的話,update score=100 就不好了,改為update score=values(score),value關鍵字中的score取值就是100.

但是該方法可能產生死鎖,insert … on duplicate key 在執行時,innodb引擎會先判斷插入的行是否產生重複key錯誤,

如果存在,在對該現有的行加上s(共享鎖)鎖,如果返回該行資料給mysql,然後mysql執行完duplicate後的update操作,

然後對該記錄加上x(排他鎖),最後進行update寫入。

如果有兩個事務併發的執行同樣的語句,

那麼就會產生death lock,如

建議:

1、盡量對存在多個唯一鍵的table使用該語句

2、在有可能有併發事務執行的insert 的內容一樣情況下不使用該語句

4、結論:這三種方法都能避免主鍵或者唯一索引重複導致的插入失敗問題。

insert ignore能忽略重複資料,只插入不重複的資料。

replace into和insert … on duplicate key update,都是替換原有的重複資料,區別在於replace into是刪除原有的行後,在插入新行,如有自增id,這個會造成自增id的改變;insert … on duplicate key update在遇到重複行時,會直接更新原有的行,具體更新哪些字段怎麼更新,取決於update後的語句。

如果a表中的某個列依賴與b表中的某個列,那麼就稱a表為子表,b表為父表。

子表和父表可以使用外來鍵來關聯起來,

下面的student_info就是乙個父表,student_score就是子表。

這樣,在對student_score表插入資料的時候,mysql都會為我們檢查一下插入的學號是否能在student_info表中找到,如果找不到則會報錯。

外來鍵的利與弊?

總的來說物理外來鍵是個比較「重」的實現,他會不顧效能不分輕重緩急的給你保證一致性。加上mysql的外來鍵設計的不好,所以帶來了效能問題。一般情況下都不做物理外來鍵。

mysql外來鍵的效能問題:

1.資料庫需要維護外來鍵的內部管理;

2.外來鍵等於把資料的一致性事務實現,全部交給資料庫伺服器完成;

3.有了外來鍵,當做一些涉及外來鍵字段的增,刪,更新操作之後,需要觸發相關操作去檢查,而不得不消耗資源;

4.外來鍵還會因為需要請求對其他表內部加鎖而容易出現死鎖情況;

在為列定義auto_increment屬性的時候需要注意這幾點:

mysql欄位屬性

1,auto increment auto increment能為新插入的行賦乙個唯一的整數標誌符 mysql要求將auto increment屬性用於作為主鍵的列,此外,每個表只允許有乙個auto increment列 例 id smallint not null auto increment p...

mySql 修改字段屬性

在我們的開發過程中,有很多時候會遇到我們在資料庫新增乙個字段,但是後續開發的時候可能發現這個欄位的備註或者是長度需要更改,那這個時候我們就有兩種方案來選擇,一種就是比如說喲預設值的,這個時候,我們就可以先刪除這個字段,然後再重新新增,或者是先刪除這個備註,然後再重新新增。如下 alter table...

mysql 取得字段屬性(metadata)

result mysql query select from crm customer or die query failed mysql error get column metadata i 0 while i mysql num fields result echo blob meta blo...