【CREATE。裕粒拢蹋排c關(guān)系】 中國(guó)式關(guān)系
發(fā)布時(shí)間:2020-02-16 來源: 歷史回眸 點(diǎn)擊:
收稿日期:2006-09-10? 作者簡(jiǎn)介:蔣景行(1945-),男,湖南邵陽人,武漢科技大學(xué)中南分校信息工程學(xué)院高級(jí)工程師。? (武漢科技大學(xué)中南分校 信息工程學(xué)院,湖北 武漢 430223)?
摘要:關(guān)系數(shù)據(jù)庫(kù)的建表命令CREATE TABLE常被去掉可選項(xiàng)而使用,這種用法存在功能上的不足。本文從數(shù)學(xué)上關(guān)系的性質(zhì)出發(fā),說明數(shù)據(jù)庫(kù)的建表命令CREATE TABLE必須帶上可選項(xiàng)PRIMARY KEY才能建立起來關(guān)系,亦即PRIMARY KEY是CREATE TABLE的不可不選的選項(xiàng)。?
關(guān)鍵詞:數(shù)據(jù)庫(kù);SQL;建表?
中圖分類號(hào):TP311.13文獻(xiàn)標(biāo)識(shí)碼:A??
CREATE TABLE是關(guān)系數(shù)據(jù)庫(kù)的建表命令。關(guān)系數(shù)據(jù)庫(kù)基于集合論中的關(guān)系,數(shù)學(xué)上稱為關(guān)系、數(shù)據(jù)庫(kù)里稱為表。所以建表就是建立關(guān)系。?
一、關(guān)系及其行列性質(zhì)?
關(guān)系是集合的笛卡兒乘積的子集。?
設(shè)有學(xué)生屬性集合:?
姓名={張三,李四,王嫵}?
性別={男,女}?
年齡={18,19}?
籍貫={湖南,湖北,江西}?
姓名×性別×年齡×籍貫是它們的一個(gè)笛卡兒乘積:?
張三 男 18 湖南?
張三 男 18 湖北?
張三 男 18 江西?
張三 男 19 湖南?
張三 男 19 湖北?
張三 男 19 江西?
張三 女 18 湖南?
張三 女 18 湖北?
張三 女 18 江西?
張三 女 19 湖南?
張三 女 19 湖北?
張三 女 19 江西?
李四 男 18 湖南?
李四 男 18 湖北?
李四 男 18 江西?
李四 男 19 湖南?
李四 男 19 湖北?
李四 男 19 江西?
李四 女 18 湖南?
李四 女 18 湖北?
李四 女 18 江西?
李四 女 19 湖南?
李四 女 19 湖北?
李四 女 19 江西?
王嫵 男 18 湖南?
王嫵 男 18 湖北?
王嫵 男 18 江西?
王嫵 男 19 湖南?
王嫵 男 19 湖北?
王嫵 男 19 江西?
王嫵 女 18 湖南?
王嫵 女 18 湖北?
王嫵 女 18 江西?
王嫵 女 19 湖南?
王嫵 女 19 湖北?
王嫵 女 19 江西?
該乘積包含了這4個(gè)屬性各元素按照姓名―性別―年齡―籍貫順序的所有可能的組合。一個(gè)組合稱為一個(gè)元組(屬性元素的組合),所有元組構(gòu)成一個(gè)集合。笛卡兒乘積排成單純的行列,屬性也稱為列,元組也稱為行。?
。ㄒ唬╆P(guān)系無重復(fù)行?
笛卡兒乘積的子集有很多個(gè)。一行是子集,多行也是、全部行也是,它們稱為關(guān)系。例如:?
張三 男 19 江西?
李四 男 18 湖北?
王嫵 女 18 湖南?
當(dāng)然,下面也是一個(gè)關(guān)系:?
張三 男 19 江西?
李四 男 18 湖北?
王嫵 女 18 湖南?
李四 男 18 江西?
這個(gè)關(guān)系里含有兩個(gè)名叫李四的學(xué)生,都是18歲的男生,但一個(gè)是湖北人、一個(gè)是江西人。?
極端地說,整個(gè)笛卡兒乘積也是一個(gè)關(guān)系。關(guān)系里含有12個(gè)名叫張三的學(xué)生:一個(gè)18歲的男湖南人、一個(gè)18歲的男湖北人、一個(gè)18歲的男江西人、……,還有一個(gè)19歲的女江西人。李四、王嫵也一樣。?
很明顯,笛卡兒乘積無重復(fù)行;關(guān)系自然也無重復(fù)行。無重復(fù)行是關(guān)系的一個(gè)重要性質(zhì)。?
事物由它的屬性表征。關(guān)系的第一行表征一個(gè)19歲的男性江西學(xué)生名叫張三,每一行表征一個(gè)學(xué)生;行行不同,這就構(gòu)成一張實(shí)用的二維學(xué)生表。?
。ǘ⿲(shí)用二維表都可以用關(guān)系來構(gòu)造?
上面的笛卡兒乘積中只有一個(gè)18歲的男湖南張三、而沒有第二個(gè)。那么,一個(gè)含有兩個(gè)18歲的男湖南張三的關(guān)系,怎樣去構(gòu)造呢?增加一個(gè)屬性集合,例如學(xué)號(hào)={901,902,903,904},從姓名、性別、年齡、籍貫、學(xué)號(hào)這5個(gè)集合的笛卡兒乘積中選取子集;那里面有4個(gè)18歲的男湖南張三、但學(xué)號(hào)彼此不同,分別是901、902、903、904。?
一般地說,屬性集合:?
姓名={姓名|可用作姓名的字符串}?
性別={性別|男/女}?
年齡={年齡|自然數(shù)}?
籍貫={籍貫|現(xiàn)用地名字符串}?
可以構(gòu)造出所有具有這4個(gè)屬性的任何學(xué)生關(guān)系。?
于是,關(guān)系被作為存儲(chǔ)同類事物個(gè)體的模型。?
二、CREATE TABLE命令?
關(guān)系由集合的元素結(jié)構(gòu)而成,每一行都按照統(tǒng)一的順序從各個(gè)集合里取出一個(gè)元素,兩行之間至少有一個(gè)元素不同。對(duì)行的結(jié)構(gòu)的說明,即對(duì)構(gòu)成關(guān)系的各集合的名稱、類型、順序、以及集合之間的關(guān)系等的說明,稱為關(guān)系模式,形象地說就是二維表的表頭。按照關(guān)系模式存入的數(shù)據(jù)便結(jié)構(gòu)成關(guān)系,在表頭下填入的數(shù)據(jù)便結(jié)構(gòu)成關(guān)系。?
數(shù)據(jù)庫(kù)建立關(guān)系分為兩步:用CREATE TABLE命令建立關(guān)系模式,然后用INSERT命令輸入數(shù)據(jù)。所輸入的數(shù)據(jù)便結(jié)構(gòu)成關(guān)系。?
在標(biāo)準(zhǔn)語言SQL99中,CREATE TABLE命令的語法格式如下(各管理系統(tǒng)大同小異):?
CREATE \[{GLOBAL|LOCAL} TEMPORARY\] TABLE <table_name>?
。?
。糲olumn_name>{<domain_name>|<datatype>\[<size1>\[,<size2>\]\]}?
\[<column_constraint>,…\]?
\[DEFAULT<default_value>\]?
\[COLLATE<collation_name>\],…?
\[<table_constraints>\]?
\[ON COMMIT{DELETE|PRESERVE}ROWS\]?
)?
命令包括兩大功能部分。前面的<column_name>必選項(xiàng)部分,定義關(guān)系名與各列的屬性,即安排橫向列、同時(shí)檢測(cè)列不重名(后輸入的屬性如果與已輸入的屬性重名則提示錯(cuò)誤)。后面的諸多可選項(xiàng)部分,定義關(guān)系的完整性約束;檢測(cè)行不重復(fù)的功能項(xiàng)primary key包含在\[<column_constraint>,…\]、\[<table_constraints>\]里面。兩大功能是一個(gè)整體。?
從建立關(guān)系的角度來說,使用這個(gè)命令至少要選取primary key一項(xiàng)如下:?
CREATE。裕粒拢蹋牛迹簦幔猓欤澹撸睿幔恚澹?
(<column_name><datatype>\[<size1>\[,<size2>\]\]?
\[{,<column_name><datatype>\[<size1>\[,<size2>\]\]}…\]?
,primary key(<primary。耄澹荆?
)?
三、命令的簡(jiǎn)便形式及其功能之不足?
形式上,CREATE TABLE命令有多個(gè)必選項(xiàng)和可選項(xiàng)。可選項(xiàng)可選可不選,于是便有了去掉可選項(xiàng)的簡(jiǎn)便形式:?
CREATE\[{GLOBAL|LOCAL}TEMPORARY\]TABLE<table_name>?
(?
。糲olumn_name>{<domain_name>|?
<datatype>\[<size1>\[,<size2>\]\]}?
)?
這個(gè)形式常常被引用來建表,特別是舉例的時(shí)候,例如一本教科書的敘述:?
?
基本表的創(chuàng)建語句的基本形式為:?
CREATE TABLE table_name?
。–ol_name1 Type1 \[NOT NULL/NULL\]?
\[{,Col_name2 Type2 \[NOT NULL/NULL\]}…\]?
。?
例:創(chuàng)建下面的學(xué)生表:?
學(xué)號(hào) 姓 名 性 別 籍貫?
0901 張小強(qiáng) 男 湖南?
0902 李 哲 男 江西?
0903 馮 姍 女 湖南?
CREATE TABLE 學(xué)生表?
(學(xué)號(hào) CHAR(4),姓名 CHAR(8),性別 CHAR(2),籍貫 CHAR(6))?
?
當(dāng)然,這個(gè)命令能夠生成例中的學(xué)生表;但是它也能夠生成具有重復(fù)記錄的下面這張表:?
學(xué)號(hào) 姓 名 性別 籍貫?
0901 張小強(qiáng) 男 湖南?
0902 李 哲 男 江西?
0903 馮 姍 女 湖南?
0902 李 哲 男 江西?
這是學(xué)生表加上一條重復(fù)記錄。顯然,這張表不是關(guān)系。?
用命令統(tǒng)計(jì)這張表的記錄條數(shù),結(jié)果是4;插入記錄完全自由,再插入一條李哲的記錄也可以;修改李哲的籍貫,兩條李哲記錄的籍貫都被修改;刪除李哲,兩條李哲的記錄都被刪除?梢,在統(tǒng)計(jì)、插入、修改、刪除的過程中,RDBMS并不檢測(cè)所操作的表是關(guān)系還是不是關(guān)系;就過程本身而言,操作關(guān)系得到關(guān)系的結(jié)果,操作非關(guān)系得到非關(guān)系的結(jié)果。?
要是使用SQL Server界面修改李哲的籍貫和刪除李哲的記錄,則不允許進(jìn)行,想改變表中記錄重復(fù)的現(xiàn)狀還做不到。(不使用命令的話,這張表豈不只能作廢?)?
能夠生成不是關(guān)系的表體現(xiàn)了簡(jiǎn)便形式的功能不足。簡(jiǎn)便形式能夠完善地定義屬性列、卻不能檢測(cè)重復(fù)的元組行,它缺少定義主鍵的功能。?
雖然在進(jìn)一步將學(xué)生表作為另一張表(譬如成績(jī)表)的參照對(duì)象、而建立兩表聯(lián)系的時(shí)候,系統(tǒng)的參照完整性規(guī)則會(huì)要求它設(shè)置主鍵;而一旦設(shè)置主鍵,學(xué)生表就會(huì)受到規(guī)范。但是,一開始就建立規(guī)范的關(guān)系才是正確的選擇。?
雖然使用簡(jiǎn)便形式建立模式、在輸入記錄的時(shí)候注意不讓它重復(fù),也能建立起關(guān)系;但是,記錄量一大就難以做到,同時(shí)手誤也是難以避免的。?
關(guān)系數(shù)據(jù)庫(kù)的基礎(chǔ)是關(guān)系,操作對(duì)象是關(guān)系、操作結(jié)果也是關(guān)系,所以,使用CREATE TABLE命令建立的應(yīng)該是關(guān)系。這理所當(dāng)然。特別是訓(xùn)練學(xué)生使用CREATE TABLE命令,為養(yǎng)成良好的、科學(xué)的習(xí)慣,當(dāng)以建立關(guān)系為上。具體到前面的例題,最好使用下面的命令:?
CREATE TABLE 學(xué)生表?
(姓 名 char(8),性別 char(2),年齡 int,籍貫 char(4),primary key (姓名))?
參考文獻(xiàn)?
[1]陳洛資.數(shù)據(jù)庫(kù)系統(tǒng)及應(yīng)用基礎(chǔ)[M].北京:北方交通大學(xué)出版社,2002.?
[2]孔璐,吳志堅(jiān),顧洪.數(shù)據(jù)庫(kù)原理與開發(fā)應(yīng)用技術(shù)[M].北京:國(guó)防工業(yè)出版社,2004.?
[3]關(guān)敬敏,沈立強(qiáng),李莉.SQL Server數(shù)據(jù)庫(kù)應(yīng)用教程[M].北京:清華大學(xué)出版社,2005.?
[4][美]Alex Kriegel,Boris M.Trukhno著,陳冰等譯.SQL寶典[G].北京:電子工業(yè)出版社,2003.?
[5][美]Paul Nielsen著,劉瑞,陳微,閆繼忠,劉文等譯,SQL Server 2000寶典[G].北京:中國(guó)鐵道出版社,2004.?
[6][美]Robert Sheldon著,黃開枝,冉曉?等譯.SQL實(shí)用教程[M].北京:清華大學(xué)出版社,2004.?
相關(guān)熱詞搜索:關(guān)系 CREATE TABLE CREATE。裕粒拢蹋排c關(guān)系 create table語句 sql create table
熱點(diǎn)文章閱讀