建立一個(gè)zhan表,但是沒建立主鍵,我想新建一個(gè)字段id作為主鍵,如何寫???
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站制作與策劃設(shè)計(jì),泰來網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:泰來等地區(qū)。泰來做網(wǎng)站價(jià)格咨詢:028-86922220
MySQL數(shù)據(jù)表使用InnoDB作為存儲引擎的時(shí)候,數(shù)據(jù)結(jié)構(gòu)就是使用B+樹,而數(shù)據(jù)本身存儲在主鍵索引上,也就是通常所說的聚簇索引,也就是每個(gè)表都需要有個(gè)聚簇索引樹,但是,在建表的時(shí)候卻發(fā)現(xiàn)可以不用指定主鍵,那么MySQL對于沒有指定主鍵的表示如何處理的呢?
對于InnoDB,可以簡單地把所有數(shù)據(jù)視為索引,每一個(gè)索引都對應(yīng)一個(gè)B+數(shù),而主鍵對應(yīng)的索引就是聚簇索引,表的所有數(shù)據(jù)都存儲在聚簇索引上,而除了聚簇索引的普通索引存儲的只是主鍵的引用,所以,查詢的時(shí)候?qū)τ谄胀ㄋ饕枰M(jìn)行 回表 才能取到具體數(shù)據(jù)。
既然InnoDB對數(shù)據(jù)的存儲必須依賴于主鍵,那么對于沒有創(chuàng)建主鍵的表,該怎么辦?
InnoDB對聚簇索引處理如下:
很明顯,缺少主鍵的表,InnoDB會內(nèi)置一列用于聚簇索引來組織數(shù)據(jù)。而沒有建立主鍵的話就沒法通過主鍵來進(jìn)行索引,查詢的時(shí)候都是全表掃描,小數(shù)據(jù)量沒問題,大數(shù)據(jù)量就會出現(xiàn)性能問題。
但是,問題真的只是查詢影響嗎?不是的,對于生成的ROW_ID,其自增的實(shí)現(xiàn)來源于一個(gè)全局的序列,而所以有ROW_ID的表共享該序列,這也意味著插入的時(shí)候生成需要共享一個(gè)序列,那么高并發(fā)插入的時(shí)候?yàn)榱吮3治ㄒ恍跃捅苊獠涣随i的競爭,進(jìn)而影響性能。
既然知道InnoDB對數(shù)據(jù)的存儲和處理都是基于聚簇索引的,那么,在建表時(shí)候要注意主鍵的重要性,為每個(gè)表都設(shè)置一個(gè)主鍵,如果沒有合適的字段來作為主鍵,可以設(shè)置一個(gè)業(yè)務(wù)無關(guān)的的代理主鍵,可以是自增ID,也可以是UUID(建議使用自增ID,性能較好)。
在理解InnoDB的數(shù)據(jù)結(jié)構(gòu)之后自然而然就會知道主鍵的重要性,在建表的時(shí)候也不會忘記設(shè)置主鍵,無論表設(shè)計(jì)有無合適的唯一字段,都需要設(shè)置一個(gè)主鍵,提高性能的同時(shí)也是一種好的習(xí)慣,對于后續(xù)的拓展以及表之間關(guān)聯(lián)都有一定的拓展性。
1.外鍵的作用,主要有兩個(gè):
一個(gè)是讓數(shù)據(jù)庫自己通過外鍵來保證數(shù)據(jù)的完整性和一致性
一個(gè)就是能夠增加ER圖的可讀性
2.外鍵的配置
1)先創(chuàng)建一個(gè)主表,代碼如下:
#創(chuàng)建表student,并添加各種約束
create table student
(
id int primary key , #主鍵約束
name varchar(20) , #唯一約束
age int NOT NULL, #非空約束
sex varchar(2) ,
address varchar(20) default '重慶' #默認(rèn)約束
) ;
再通過一個(gè)外鍵,創(chuàng)建一個(gè)分?jǐn)?shù)表,這樣的話,就可以方便查詢。代碼如下:
#創(chuàng)建分?jǐn)?shù)表
create table score
(
id int primary key ,
sid int ,
china int ,
history int,
english int,
constraint FK_sid foreign key(sid) references student(id) #通過外鍵創(chuàng)建鏈接
) ;
創(chuàng)建外鍵的方法有很多,其中最常見創(chuàng)建外鍵的格式是:constraint FK_*** foreign key(**) references 鏈接的外表
刪除外鍵:
alter table drop foreign key '外鍵名'.
注意:
只有在定義外鍵時(shí),用constraint 外鍵名 foreign key .... 方便進(jìn)行外鍵的刪除
主鍵是唯一標(biāo)示這一行的,就好像你的身份證號一樣,每個(gè)人只有一個(gè),也是唯一能證明你是你的東西。外鍵是別人執(zhí)行你的東西。也就是說如果一個(gè)人想和你有點(diǎn)關(guān)系怎么辦,那就要關(guān)聯(lián)起來,怎么關(guān)聯(lián)起來,就通過外鍵啊
定義主鍵和外鍵主要是為了維護(hù)關(guān)系數(shù)據(jù)庫的完整性,總結(jié)一下:
一、主鍵是能確定一條記錄的唯一標(biāo)識,比如,一條記錄包括身份正號,姓名,年齡。身份證號是唯一能確定你這個(gè)人的,其他都可能有重復(fù),所以,身份證號是主鍵。
外鍵用于與另一張表的關(guān)聯(lián)。是能確定另一張表記錄的字段,用于保持?jǐn)?shù)據(jù)的一致性。比如,A表中的一個(gè)字段,是B表的主鍵,那他就可以是A表的外鍵。
1.主鍵語法
①創(chuàng)建時(shí):create table sc (
studentno int,
courseid int,
score int,
primary key (studentno) );
②修改時(shí):ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(列名);
前提是原先沒有設(shè)置主鍵。
2.外鍵語法
①創(chuàng)建時(shí):create table sc (
studentno int,
courseid int,
score int,
foreign key (courseid) );
②修改時(shí):
ALTER TABLE news_info[子表名] ADD CONSTRAINT FK_news_info_news_type[約束名] FOREIGN KEY (info_id)[子表列] REFERENCES news_type[主表名] (id)[主表列] ;
3.使用組合主鍵
如果一列不能唯一區(qū)分一個(gè)表里的記錄時(shí),可以考慮多個(gè)列組合起來達(dá)到區(qū)分表記錄的唯一性,形式
①創(chuàng)建時(shí):create table sc (
studentno int,
courseid int,
score int,
primary key (studentno,courseid) );
②修改時(shí):alter table tb_name add primary key (字段1,字段2,字段3);
前提是原來表中沒有設(shè)置主鍵,若原先已有主鍵則會報(bào)錯(cuò)。
1 意思是:
這個(gè)視圖沒有主鍵;更新表時(shí)將會使用下列虛擬語句:
update v_sys_user set 更新的列=更新的值 where 列1=列1的舊值 and 列2=列2的舊值 and ... limit 1;(這個(gè)的意思就是,如果視圖是可更新視圖,在表格窗口中更改某列值時(shí)會使用類似上邊的語句來完成,where后是所有的列必須等于舊值)
2 只做查詢時(shí)可以不用理會,如果要通過視圖更新某列值時(shí),就看上邊提示的語句符合不符合你的要求了。
在SYBASE的ASE和ASA中,可以使用如下的系統(tǒng)存儲過程來獲取主鍵:
exec sp_pkeys 'table_name';
sql server也是一樣的!
至于mysql,我沒這個(gè)環(huán)境,相信應(yīng)該有類似的存儲過程的!