1樓:青鳥中關村專家
1、主鍵定義
表中經常有一個列或多列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵,通過它可強制表的實體完整性。當建立或更改表時可通過定義 primary key 約束來建立主鍵。
一個表只能有一個 primary key 約束,而且 primary key 約束中的列不能接受空值。由於 primary key 約束確保唯一資料,所以經常用來定義標識列。
2、主鍵作用
1)保證實體的完整性;
2)加快資料庫的操作速度
3) 在表中新增新記錄時,資料庫會自動檢查新記錄的主鍵值,不允許該值與其他記錄的主鍵值重複。
4) 資料庫自動按主鍵值的順序顯示錶中的記錄。如果沒有定義主鍵,則按輸入記錄的順序顯示錶中的記錄。
3、主鍵的必要性
在有些資料庫中,雖然主鍵不是必需的,但最好為每個表都設定一個主鍵,不管是單主鍵還是複合主鍵。它存在代表著表結構的完整性,表的記錄必須得有唯一區分的欄位,主鍵主要是用於其他表的外來鍵關聯,以及本記錄的修改與刪除。
4、主鍵的選擇
1)編號作主鍵
此方法就是採用實際業務中的唯一欄位的「編號」作為主鍵設計,這在小型的專案中是推薦這樣做的,因為這可以使專案比較簡單化,但在使用中卻可能帶來一些麻煩,比如要進行「編號修改」時,可能要涉及到很多相關聯的其他表
2)自動編號主鍵
這種方法也是很多人在使用的,就是新建一個id欄位,自動增長,非常方便也滿足主鍵的原則
a、優點:資料庫自動編號,速度快,而且是增量增長,聚集型主鍵按順序存放,對於檢索非常有利;數字型的,佔用空間小,易排序,在程式中傳遞也方便;如果通過非系統增加記錄(比如手動錄入,或是用其他工具直接在表裡插入新記錄,或老系統資料匯入)時,非常方便,不用擔心主鍵重複問題。
b、缺點:其實缺點也就是來自其優點,就是因為自動增長,在手動要插入指定id的記錄時會顯得麻煩,尤其是當系統與其他系統整合時,需要資料匯入時,很難保證原系統的id不發生主鍵衝突(前提是老系統也是數字型的);如果其他系統主鍵不是數字型那就麻煩更大了,會導致修改主鍵資料型別了,這也會導致其他相關表的修改,後果同樣很嚴重;就算其他系統也是數字型的,在匯入時,為了區分新老資料,可能想在老資料主鍵前統一加一個「o」(old)來表示這是老資料,那麼自動增長的數字型又面臨一個挑戰。
3)max加一
由於自動編號存在那些問題,所以有些人就採用自己生成,同樣是數字型的,只是把自動增長去掉了,採用在insert時,讀取max值後加一,這種方法可以避免自動編號的問題,但也存在一個效率問題,如果記錄非常大的話,那麼max()也會影響效率的;更嚴重的是併發性問題,如果同時有兩人讀到相同的max後,加一後插入的id值會重複,這已經是有經驗教訓的了。
4)自制加一
考慮max加一的效率後,有人採用自制加一,也就是建一個特別的表,欄位為:表名,當前序列值。這樣在往表中插入值時,先從此表中找到相應表的最大值後加一,進行插入,有人可能發現,也可能會存在併發處理,這個併發處理,可以採用loc**程的方式來避免,在生成此值的時,先lock,取到值以後,再unlock出來,這樣不會有兩人同時生成了。
這比max加一的速度要快多了。但同樣存在一個問題:在與其他系統整合時,脫離了系統中的生成方法後,很麻煩保證自制表中的最大值與匯入後的保持一致,而且數字型都存在上面講到的「o」老資料的匯入問題。
因此在「自制加一」中可以把主鍵設為字元型的。字元型的自制加一中應該字元型主鍵可以應付很多我們意想不到的情況。
5)guid主鍵
目前一個比較好的主鍵是採用guid,推薦主鍵還是字元型的,但值由guid生成,guid是可以自動生成,也可以程式生成,而且鍵值不可能重複,可以解決系統整合問題,幾個系統的guid值導到一起時,也不會發生重複,就算有「o」老資料也可以區分,而且效率很高,在.***裡可以直接使用system.guid.
newguid()進行生成,在sql裡也可以使用newid()生成。優點是:
同identity 列相比,uniqueidentifier 列可以通過newid() 函式提前得知新增加的行id,為應用程式的後續處理提供了很大方便。
a、優點:便於資料庫移植,其它資料庫中並不一定具有identity 列,而guid 列可以作為字元型列轉換到其它資料庫中,同時將應用程式中產生的guid 值存入資料庫,它不會對原有資料帶來影響。便於資料庫初始化,如果應用程式要載入一些初始資料,identity 列的處理方式就比較麻煩,而uniqueidentifier 列則無需任何處理,直接用t-sql 載入即可。
便於對某些物件或常量進行永久標識,如類的classid,物件的例項標識,uddi 中的聯絡人、服務介面、tmodel標識定義等。
b:缺點是:
guid 值較長,不容易記憶和輸入,而且這個值是隨機、無順序的
guid 的值有16 個位元組,與其它那些諸如4 位元組的整數相比要相對大一些。這意味著如果在資料庫中使用uniqueidentifier 鍵,可能會帶來兩方面的消極影響:儲存空間增大;索引時間較慢。
2樓:秋梵清涵
可以用自動標示做。
每增加1個人的名字,自動標示就自動增加數字1,永遠都不會重複,就算你把其中一個刪除掉了,它的標示數字也不會在出現,做到了永遠不重複。
3樓:
當然用id做主鍵了,要是有重名的你的資料庫就存不了了,太侷限了
4樓:匿名使用者
關係型資料庫的特點在於多個表之間使用關係聯絡起來這樣可以顯著降低資料庫的容量,並提高維護效率主鍵並不是必須的
但是增加主鍵對單表查詢的效率提升很高
所以從原理上來說只要該欄位絕對不會重複
那麼使用任何型別的欄位,比如你上面所說的人名也是可以的但是如果考慮到與其它表的相互連線
使用人名的可操作性就不是很好
所以,第一點,建議你另外增加一個自動編號的欄位作為id,用來做主鍵第二點,關係型資料庫的特點就是多表之間有冗餘,但是實際上是降低了整個資料庫的維護難度,
鑑於你看起來對關係型資料庫原理不清楚
更建議你先把關係型資料庫原理再看看
mysql設定主鍵的**是什麼?
5樓:仁昌居士
mysql設定主鍵的**是primary key (主鍵欄位)。
如:create table customer (sid integer,last_name varchar(30),first_name varchar(30),primary key (sid))。
主關鍵字(主鍵,primary key)是被挑選出來,作表的行的唯一標識的候選關鍵字。一個表只有一個主關鍵字。主關鍵字又可以稱為主鍵。
6樓:蘇東坡發火
primary key
1、最簡單的:
create table t1(
id int not null,
name char(20)
);2、帶主鍵的:
a:create table t1(
id int not null primary key,name char(20)
);b:複合主鍵
create table t1(
id int not null,
name char(20),
primary key (id,name));3、帶預設值的:
create table t1(
id int not null default 0 primary key,
name char(20) default '1');
7樓:愛學無止境愛
alter table tablename add primary key(欄位名)
mysql資料庫怎樣建立表,MYsql資料庫怎樣建立表?
比如要建立學生表表名為student,學生表有欄位學號 no 年齡 age create table student no int primary key 主鍵 age int 執行下就建立好了 隨便舉的例子,明白吧?謝謝採納!create database cookbook 建立一個叫 cookb...
mysql如何獲取資料庫下所有的表
參考下面的sql,去掉table name的條件,就會出來所有的表名了 select column name 列名,data type 欄位型別,column comment 欄位註釋 from information schema.columnswhere table name companies...
php操作MySQL資料庫判斷多個資料表是否存在,不存在就建立要怎麼寫呢
servername localhost username username password password dbname mydb 建立連線 conn new mysqli servername,username,password,dbname 檢測連線 if conn connect err...