武漢做網(wǎng)站的知名公司個(gè)人網(wǎng)頁怎么制作
目錄
?一,SQL server的數(shù)據(jù)類型
1,基本數(shù)據(jù)類型
2,自定義數(shù)據(jù)類型
?二,使用T-SQL創(chuàng)建表
1,數(shù)據(jù)完整性的分類
2,約束的類型
3,創(chuàng)建表時(shí)創(chuàng)建約束
4,任務(wù)
5,由任務(wù)編寫的SQL語句?
三,使用T-SQL管理表?
1,創(chuàng)表時(shí)添加約束名?
1)添加約束名?
2) 修改由任務(wù)編寫的SQL語句 (添加約束名)
2,使用ALTER TABLE修改表
1)從表中刪除列
2)向表中添加列?
3)修改表中列的長度
4)對(duì)指定表添加默認(rèn)約束?
?3,使用DROP TABLE刪除表
通過前一篇SQL server學(xué)習(xí)02-使用T-SQL創(chuàng)建數(shù)據(jù)庫-CSDN博客的學(xué)習(xí)
我已經(jīng)創(chuàng)建好了數(shù)據(jù)庫,接下來開始使用創(chuàng)好的庫創(chuàng)表。首先了解表的概念:
- 表是數(shù)據(jù)關(guān)系模型中表示實(shí)體的方式?
- 表是數(shù)據(jù)庫中用來組織和存儲(chǔ)數(shù)據(jù),具有行列結(jié)構(gòu)的數(shù)據(jù)庫對(duì)象,數(shù)據(jù)庫中的數(shù)據(jù)都存儲(chǔ)在表中。
- 表由行和列組成。
值得注意的是,一張表就是一個(gè)關(guān)系。 表有行和列,關(guān)系有記錄和字段。表有表名,每個(gè)關(guān)系都有一個(gè)關(guān)系名。
行稱為記錄,是組織數(shù)據(jù)的單位,每行都是一條獨(dú)立的數(shù)據(jù)記錄。
列稱為字段,主要描述數(shù)據(jù)的屬性。
如下就是常見的一張excel二維表。
表分為普通表和系統(tǒng)表。
- 普通表由用戶創(chuàng)建:用戶定義的表也稱為標(biāo)準(zhǔn)表,用來存儲(chǔ)數(shù)據(jù)庫應(yīng)用系統(tǒng)中的數(shù)據(jù)。
- 系統(tǒng)表由系統(tǒng)創(chuàng)建:存儲(chǔ)了有關(guān)數(shù)據(jù)庫服務(wù)器的配置,數(shù)據(jù)庫設(shè)置,用戶和數(shù)據(jù)庫對(duì)象的描述等系統(tǒng)信息,用戶不能創(chuàng)建。
在同一個(gè)數(shù)據(jù)庫中,表名不能重復(fù),在同一張表中列名不允許相同,但在不同的表中列名可以相同。
【ps:同一張表列名重復(fù)無意義。由于不同表之間可能存在聯(lián)系,因此會(huì)有相同列名?!?/p>
?一,SQL server的數(shù)據(jù)類型
?在創(chuàng)建表之前,需要考慮要?jiǎng)?chuàng)建的表包含哪些內(nèi)容,例如一張表包含
- 哪些列
- 每列都是什么數(shù)據(jù)類型
可以看到,在創(chuàng)表時(shí),數(shù)據(jù)類型很關(guān)鍵。SQL server提供了基本數(shù)據(jù)類型和自定義數(shù)據(jù)類型。
先來學(xué)習(xí)基本數(shù)據(jù)類型(也稱系統(tǒng)數(shù)據(jù)類型)。
1,基本數(shù)據(jù)類型
基本數(shù)據(jù)類型是系統(tǒng)本身就自帶的,可以直接拿來用,如下👇?
2,自定義數(shù)據(jù)類型
自定義數(shù)據(jù)類型不是系統(tǒng)自帶的基本數(shù)據(jù)類型,但用戶需要以SQL server系統(tǒng)數(shù)據(jù)類型為基礎(chǔ)創(chuàng)建。
當(dāng)多張表中的列要存儲(chǔ)相同類型的數(shù)據(jù)時(shí),往往要確保這些列具有完全相同的數(shù)據(jù)類型,長度和為空性(數(shù)據(jù)的值是否允許為空)?,可以通過用戶自定義數(shù)據(jù)類型來實(shí)現(xiàn)。例如:
- 電話的長度都為11,非空,且唯一。
如果某個(gè)系統(tǒng)要求電話這一列的長度為11個(gè)字符,那么有效的電話內(nèi)容可以是“12345678912”或“98765432121”,但“123”或“123456”就不符合這個(gè)要求。
? - 身份證的長度為18,非空,且唯一。
下面通過SSMS創(chuàng)建一個(gè)名為char30的自定義數(shù)據(jù)類型,要求基于char系統(tǒng)數(shù)據(jù)類型,大小為30個(gè)字符。
?鼠標(biāo)右擊“用戶定義數(shù)據(jù)類型”子節(jié)點(diǎn),可以看到之前的自定義數(shù)據(jù)類型char30已被排列在“用戶自定義數(shù)據(jù)類型”列表中:
?二,使用T-SQL創(chuàng)建表
不管是在MySQL中還是在SQL server中,創(chuàng)庫創(chuàng)表都是一樣的關(guān)鍵字"CREATE",如果創(chuàng)庫后面接DATABASE ,創(chuàng)表后面則接TABLE?。?
?在SQL server中使用T-SQL語句創(chuàng)表的語法如下:
CREATE TABLE 數(shù)據(jù)表名
(列名 數(shù)據(jù)類型[列級(jí)完整性約束條件]
[,...n]
[,表級(jí)完整性約束條件]
)
?可以看到,在上述語法總,“約束條件”出現(xiàn)了兩次。約束時(shí)SQL server提供的自動(dòng)保持?jǐn)?shù)據(jù)庫完整性的一種方法。之所以存在約束條件,是因?yàn)樾枰3謹(jǐn)?shù)據(jù)庫的完整性(即數(shù)據(jù)完整性)。
?用戶在向表格中添加數(shù)據(jù)時(shí),有些數(shù)據(jù)的內(nèi)容可能與實(shí)際情況不相符,例如:
- 年齡:1000歲? ? ?(沒有人能夠活到1千歲)
- 性別:好? ? ? ? ? ? ?(性別沒有“好”,要么是“男”或“女”,要么是美國的97 種性別中的一個(gè))
- 身份證號(hào):12? ? ?(身份證號(hào)必須是18位,極少數(shù)是15位)
- 郵箱:123? ? ? ? ? ?(郵箱格式寫錯(cuò))
可以看到,這些數(shù)據(jù)都是不可靠的,為了能夠保證數(shù)據(jù)的準(zhǔn)確可靠,就需要對(duì)數(shù)據(jù)表進(jìn)行數(shù)據(jù)完整性設(shè)置。
1,數(shù)據(jù)完整性的分類
- ?實(shí)體完整性(行完整性):
指表的每一行在表中是唯一的實(shí)體。一般用主鍵約束 PRIMARY KEY。
例如,學(xué)生表中的每一行代表表中唯一的一名學(xué)生,不會(huì)有兩行或兩行以上的記錄來表示同一個(gè)學(xué)生(太浪費(fèi)空間,沒必要)。
? - 域完整性(列完整性):
指列滿足特定的數(shù)據(jù)類型和約束。可以使用檢查約束或非空約束。
例如,成績表中成績這一列的值限定在[0,100],學(xué)生表中性別只能為“男”或“女”,年齡非空。
? - 參照完整性(引用完整性):
指表和表之間的字段指是有關(guān)聯(lián)的(特殊情況是產(chǎn)生在同一張表的不同字段值之間),參照表中的外鍵值必須存在于被參照表中的主鍵值中(這句話的意思就是:你要參照我的數(shù)據(jù),那么我的外鍵列在你的表中必須是主鍵列)。使用外鍵約束。
例如,成績表中的學(xué)號(hào)這一列(外鍵)的值必須存在于學(xué)生表中學(xué)號(hào)這一列(主鍵)的值中。
? - 用戶定義的完整性:
指某一具體的應(yīng)用必須滿足的語義要求或用戶實(shí)際的業(yè)務(wù)規(guī)則。(較少使用)
?
?接下來了解SQL server中的約束類型。
2,約束的類型
分為:
- 檢查約束(CHECK)
指定某列可取值的集合或范圍,用于實(shí)現(xiàn)域完整性。一張表可以有多個(gè)檢查約束。
在設(shè)置檢查約束時(shí),需要加上邏輯表達(dá)式,即:CHECK(邏輯表達(dá)式)
? - 默認(rèn)約束(DEFAULT)
若在表中定義了默認(rèn)值約束,用戶在插入新的數(shù)據(jù)行時(shí),如果沒有為該列指定數(shù)據(jù),那么系統(tǒng)會(huì)將默認(rèn)值賦值給該列。
? - 主鍵約束(PRIMARY KEY)
主鍵是表中某列或多個(gè)列的組合,可以唯一確定一條記錄??梢员WC實(shí)體完整性。每張表只能有一個(gè)主鍵,主鍵不能為空(即如果一個(gè)字段為主鍵,就必須同時(shí)設(shè)置為非空約束)。
? - 外鍵約束(FOREIGN)
表與表之間是有關(guān)系的,有兩張表分別為表A和表B,兩張表中有相同的列m,假設(shè)列m在表A中是主鍵(或具有唯一約束),則列m在表B中為外鍵,需要使用外鍵約束。語法如下:
?--表A中 CREATE TABLE A( 列名m 數(shù)據(jù)類型 約束條件為主鍵PRIMARY KEY, )--表B中 CREATE TABLE B( 列名m 數(shù)據(jù)類型, FOREIGN KEY (m) REFERENCES A(m) )
此時(shí),表A稱為主表(或被參考表),表B為從表或參考表。存在相互聯(lián)系的兩種表中,誰有主鍵,誰就是主表。
外鍵表示一張表中的列于另外一張表中列的引用關(guān)系,以保證不同表中數(shù)據(jù)的一致性。用于實(shí)現(xiàn)參照完整性。 - 唯一約束(UNIQUE)
用于指定表中某列或多個(gè)列的組合值,具有唯一性,確保在非主鍵列中輸入非重復(fù)值。可以保證實(shí)體的完整性。雖然這點(diǎn)和主鍵約束很像,但是使用唯一約束的字段允許為空null,并且只能有一個(gè)該字段值為空,即如果有一條記錄的該字段為空,那么其他記錄的該字段必須有值,并且這些值必須是唯一的。在一張表中,唯一約束可有多個(gè),而主鍵約束只能有一個(gè)。
例如,現(xiàn)在我有一張表的數(shù)據(jù)如下,sphone設(shè)置了唯一約束:
?sno sphone 1 153xxxxxxxx 2 null 3 189xxxxxxxx 如果再試圖插入另一條記錄,如果sphone也為空,就會(huì)違反唯一約束,從而導(dǎo)致插入失敗。
- 非空約束(NOT NULL)
指定表中的某些列必須有具體值,可以實(shí)現(xiàn)域完整性。
?
知道了數(shù)據(jù)完整性和約束條件這兩個(gè)概念,就可以在創(chuàng)建表的同時(shí)創(chuàng)建約束,也可以在修改表時(shí)創(chuàng)建約束。
為了方便后期刪除指定約束,有些時(shí)候在創(chuàng)建約束的時(shí)候可以給當(dāng)前的約束指定一個(gè)約束名字(約束名),刪除表中指定約束時(shí),可以使用指定約束的約束名來進(jìn)行刪除該約束。?constraint拘束。
添加表中約束的語法如下👇
ALTER TABLE 表名
ADD CONSTRAINT 約束名 約束條件(表中需要加指定約束的列名)
刪除表中約束時(shí),使用關(guān)鍵字DROP,如下👇
ALTER TABLE 表名
DROP CONSTRAINT 約束名;
一般不用自己寫,使用默認(rèn)的約束名就行。
3,創(chuàng)建表時(shí)創(chuàng)建約束
語法格式如下:
CREATE TABLE 數(shù)據(jù)表名(從表)
(
列名 數(shù)據(jù)類型,
.
.
.
FOREIGN KEY (列名) REFERENCES 主表名(列名)
)
4,任務(wù)
在StuScore數(shù)據(jù)庫中,根據(jù)需要還需要?jiǎng)?chuàng)建系部表,班級(jí)表和用戶表。使用T-SQL語句按照下表所示的表結(jié)構(gòu)創(chuàng)建所需的三張表。以下是數(shù)據(jù)庫中各張表的結(jié)構(gòu)👇
注意點(diǎn):
- 學(xué)生表不是第一張先創(chuàng)的表,從圖中可以看到,學(xué)生表有一個(gè)班級(jí)編號(hào)外鍵classid,表示在學(xué)生表students和班級(jí)表classes之間,班級(jí)表是主表,學(xué)生表是從表。因此要先將創(chuàng)建班級(jí)表,再創(chuàng)建學(xué)生表。
- 根據(jù)之前所學(xué)的約束條件,上面的建表就會(huì)很簡單,使用默認(rèn)的約束條件。
- 約束條件:
主鍵? PRIMARY KY
檢查? CHECK(gender='男' or gender='女')
外鍵? FOREIGN KEY
唯一? UNIQUE
?
上述表中,唯一特別的就是成績表score中的sno和cno都是主鍵約束,通過之前的學(xué)習(xí),我知道了一張表只能有一個(gè)主鍵約束。
為什么成績表score中會(huì)有兩個(gè)主鍵?
答:因?yàn)槊總€(gè)學(xué)生可以選修多門課,所以成績表中的學(xué)生學(xué)號(hào)sno就會(huì)有重復(fù),這意味著僅使用sno作為主鍵無法保證數(shù)據(jù)的實(shí)體完整性,因?yàn)樗荒芪ㄒ粯?biāo)識(shí)每一條成績記錄。然而,每個(gè)學(xué)生在同一門課程中只會(huì)有一條成績記錄,因此sno和cno的組合可以唯一標(biāo)識(shí)每一條成績記錄。通過將這兩個(gè)字段合并為一個(gè)復(fù)合主鍵,能夠有效地保證數(shù)據(jù)的實(shí)體完整性。
“復(fù)合主鍵”:就如上面的情況,一張表只能有一個(gè)主鍵,但是有些時(shí)候需要多個(gè)字段同時(shí)為一個(gè)主鍵,這種時(shí)候就需要使用到復(fù)合主鍵。
值得注意的是,因?yàn)槲沂鞘孪瓤幢斫Y(jié)構(gòu)來創(chuàng)表的,因此,我知道要用到復(fù)合主鍵,sno和cno先不加任何約束,之后再一起添加主鍵約束。
如果不小心將學(xué)號(hào)設(shè)置成了主鍵,就需要先使用如下語句刪掉原有的主鍵,再添加復(fù)合主鍵進(jìn)去。
--刪除約束
ALTER TABLE 表名
DROP CONSTRAINT 約束名 -- 添加復(fù)合主鍵約束
ALTER TABLE 表名
ADD CONSTRAINT 約束名 PRIMARY KEY(列名1,列名2)
上面這張表主要是用于連接數(shù)據(jù)庫,對(duì)應(yīng)數(shù)據(jù)庫的sa用戶及密碼。?如果后面做項(xiàng)目的話,會(huì)用到。
按照生活常識(shí):
- 沒有系部的成立,就沒有班級(jí)。
- 學(xué)生達(dá)到一定人數(shù),才會(huì)開設(shè)課程。
- 沒有學(xué)生考試,就不會(huì)有成績。
可以看到,首先應(yīng)該創(chuàng)建的是系部表,再是班級(jí)表,接著就是學(xué)生表,課程表,成績表。
編寫的sql語句如下:
5,由任務(wù)編寫的SQL語句?
USE Stuscore --之前創(chuàng)建的數(shù)據(jù)庫
----系部表
-- 檢查并刪除表 dept
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'dept' AND type = 'U')DROP TABLE dept
CREATE TABLE dept(deptno char(5) NOT NULL PRIMARY KEY,dname nchar(10) NOT NULL,dean nchar(4),phone char(8) UNIQUE
);--班級(jí)表
-- 檢查并刪除表 classes
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'classes' AND type = 'U')DROP TABLE classes;
CREATE TABLE classes(classid char(6) NOT NULL PRIMARY KEY,speciality nchar(12) NOT NULL,deptno char(5) NOT NULL, counselor nchar(4),FOREIGN KEY (deptno) REFERENCES dept(deptno)
);--學(xué)生表
-- 檢查并刪除表 students
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'students' AND type = 'U')DROP TABLE students;
CREATE TABLE students
(sno char(8) NOT NULL PRIMARY KEY,sname nchar(4) NOT NULL,gender nchar(1) CHECK(gender='男' or gender='女'),classid char(6) NOT NULL, birthday date,phone char(13) UNIQUE,FOREIGN KEY (classid) REFERENCES classes(classid)
)--課程表
-- 檢查并刪除表 courses
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'courses' AND type = 'U')DROP TABLE courses;
CREATE TABLE courses
(cno char(10) NOT NULL PRIMARY KEY,cname nvarchar(20) NOT NULL,period int NOT NULL,credit tinyint NOT NULL, type nchar(5) NOT NULL
)--成績表
-- 檢查并刪除表 score
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'score' AND type = 'U')DROP TABLE score;
CREATE TABLE score
(sno char(8) NOT NULL,cno char(10) NOT NULL,CONSTRAINT PK_score_sno_cno PRIMARY KEY(sno, cno),grade tinyint CHECK(grade>=0 and grade<=100),FOREIGN KEY (sno) REFERENCES students(sno), FOREIGN KEY (cno) REFERENCES courses(cno)
)--用戶表
-- 檢查并刪除表 users
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'users' AND type = 'U')DROP TABLE users;
CREATE TABLE users(login char(10) NOT NULL PRIMARY KEY,username nchar(5) NOT NULL, pwd char(10) NOT NULL
)-- 檢查是表中的字段是否完整
SELECT * FROM dept
SELECT * FROM classes
SELECT * FROM students
SELECT * FROM score
SELECT * FROM users
三,使用T-SQL管理表?
1,創(chuàng)表時(shí)添加約束名?
這里以系部表dept為例。
1)添加約束名?
系部表中的deptno為主鍵約束,如果不添加主鍵約束名的語句就如下編寫:
deptno char(5) NOT NULL PRIMARY KEY,
但如果想要給主鍵加上約束名,就需要先寫好列deptno不急著添加主鍵約束,需要再寫一行語句給列deptno添加主鍵約束及主鍵約束名:
deptno char(5) NOT NULL,CONSTRAINT PK_dept_deptno PRIMARY KEY(deptno),
?為什么需要給約束添加上約束名,主要是因?yàn)殡S著時(shí)間的推移,有些約束條件需要改變,比方說,成績表中的成績grade現(xiàn)在的約束是0~100分,但是滿分可能會(huì)變成150分,即約束為0~150。
如果想要在不刪除表格的前提下修改該約束,就需要通過約束名來修改該約束條件。
如果不給約束條件加上約束名,系統(tǒng)會(huì)為該約束條件分配名字,但由系統(tǒng)給的約束名字會(huì)變。
使用如下語句查看系統(tǒng)給的約束名(這里是dept表,查看主鍵PK):
SELECT name FROM sys.key_constraints WHERE parent_object_id = OBJECT_ID('dept') AND type = 'PK';
先不手動(dòng)添加約束名,dept表的deptno列約束名就會(huì)隨著程序的每一次運(yùn)行而改變,如下👇:
第一次執(zhí)行下面的語句:?
?再次執(zhí)行下面的語句:?
仔細(xì)看,會(huì)發(fā)現(xiàn)表示主鍵約束的關(guān)鍵字PK及表名dept不變,但是后面的約束名會(huì)變。?如果想要通過約束名來刪除該約束無疑是天方夜譚。因此建議只要含有主鍵約束的列最好都加上對(duì)應(yīng)的約束名。約束名可以寫成如下形式:
約束條件單詞首位字母大寫_數(shù)據(jù)表名_被添加約束的列名
手動(dòng)添加約束名之后再去查看約束名,就不會(huì)隨著程序的運(yùn)行而改變:?
2) 修改由任務(wù)編寫的SQL語句 (添加約束名)
--USE Stuscore --之前創(chuàng)建的數(shù)據(jù)庫----系部表
-- 檢查并刪除表 dept
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'dept' AND type = 'U')DROP TABLE dept
CREATE TABLE dept(dno char(5) NOT NULL CONSTRAINT PK_dept_dno PRIMARY KEY(dno), --dno系編號(hào) dne nchar(100) NOT NULL, --dne系名 dept nameddn nchar(100), --ddn系主任 dept deandpe char(11), --dpe系聯(lián)系電話 dept phoneCONSTRAINT CK_deptno_dpn UNIQUE(dpe)
)--班級(jí)表
-- 檢查并刪除表 classes
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'classes' AND type = 'U')DROP TABLE classes;
CREATE TABLE classes(cno char(6) NOT NULLCONSTRAINT PK_classes_cno PRIMARY KEY(cno), --cno班級(jí)編號(hào)cne nchar(100) NOT NULL, --cne班級(jí)名 classes namedno char(5) NOT NULL, --dno系編號(hào)ccr nchar(100), --班級(jí)輔導(dǎo)員 classes counsellorCONSTRAINT FK_dept_dno FOREIGN KEY (dno) REFERENCES dept(dno)
);--學(xué)生表
-- 檢查并刪除表 students
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'students' AND type = 'U')DROP TABLE students;
CREATE TABLE students
(sno char(8) NOT NULL CONSTRAINT PK_students_sno PRIMARY KEY(sno), --sno學(xué)生編號(hào)sne nchar(100) NOT NULL, --sne 學(xué)生名 students namessx nchar(6)CONSTRAINT CK_students_ssx CHECK(ssx='male' or ssx='female'), --ssx學(xué)生性別 students sexcno char(6) NOT NULL, --cno班級(jí)編號(hào)sbd date, --sbt學(xué)生出生日期 students birth dayspe char(11) CONSTRAINT UQ_students_spe UNIQUE(spe), --spe學(xué)生聯(lián)系方式 students phonesnn nvarchar(100) CONSTRAINT DF_students_snn DEFAULT 'China', --snn學(xué)生國籍 students nationCONSTRAINT FK_students_cno FOREIGN KEY (cno) REFERENCES classes(cno)
);--課程表
-- 檢查并刪除表 courses
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'courses' AND type = 'U')DROP TABLE courses;
CREATE TABLE courses
(cno char(10) NOT NULLCONSTRAINT PK_courses_cno PRIMARY KEY(cno), --cno課程編號(hào) cne nvarchar(100) NOT NULL, --cne 課程名 courses namecpd int NOT NULL, --cpd課程學(xué)時(shí) courses periodcct tinyint NOT NULL, --cct 課程學(xué)分 courses creditcte nchar(20) NOT NULLCONSTRAINT CK_courses_type CHECK(cte='optional_course' or cte='required_course') --cte課程類型 courses type
)--成績表
-- 檢查并刪除表 score
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'score' AND type = 'U')DROP TABLE score;
CREATE TABLE score
(sno char(8) NOT NULL, cno char(10) NOT NULL,CONSTRAINT PK_score_sno_cno PRIMARY KEY(sno, cno),get tinyint, --get 成績得分CONSTRAINT CK_score_get CHECK(get>=0 and get<=100),CONSTRAINT FK_score_sno FOREIGN KEY (sno) REFERENCES students(sno), CONSTRAINT FK_score_cno FOREIGN KEY (cno) REFERENCES courses(cno)
)--用戶表
-- 檢查并刪除表 users
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'users' AND type = 'U')DROP TABLE users;
CREATE TABLE users(uln char(100) NOT NULL CONSTRAINT PK_users_uln PRIMARY KEY(uln), --uln 用戶登錄 users loginune nchar(100) NOT NULL, --une 用戶名 users name upd char(10) NOT NULL -- upd 用戶登錄密碼 users password
)-- 檢查是表中的字段是否完整
--SELECT * FROM users
SELECT * FROM studentsSELECT * FROM deptSELECT * FROM classesSELECT * FROM score
2,使用ALTER TABLE修改表
有些時(shí)候已經(jīng)創(chuàng)好表,點(diǎn)擊執(zhí)行之后,會(huì)存在少列,少約束等問題。這些問題都不用擔(dān)心,能夠在創(chuàng)建好數(shù)據(jù)表后添加。
可以使用ALTER? TABLE... DROP COLUMN...刪除列,ALTER...ADD...添加列。
1)從表中刪除列
語法如下:?
ALTER TABLE 數(shù)據(jù)表名 DROP COLUMN 要?jiǎng)h除的列名(無任何約束條件)
?需要注意的是,刪除的列必須沒有任何約束,這里以用戶表users為例,我現(xiàn)在刪除主鍵列l(wèi)ogin
可以看到,因?yàn)橛屑s束條件-主鍵約束,所以該列無法刪除。
但是如果我想要?jiǎng)h除沒有任何約束的列pwd,是完全可以刪除的,如下👇
2)向表中添加列?
?語法如下:
ALTER TABLE 數(shù)據(jù)表名 ADD 新列的名字 新列的數(shù)據(jù)類型
依舊可以使用ALTER TABLE關(guān)鍵字將刪除的列pwd再添加回來:
3)修改表中列的長度
語法如下:?
ALTER TABLE 數(shù)據(jù)表明 COLUMN 列名(新的長度)
以上面的用戶表users為例,將列pwd的長度由原來的10變成20,可以如下編寫語句:
ALTER TABLE users ALTER COLUMN pwd char(20)
?如果想要查看修改的長度是否生效,可以使用如下語句查看列的長度:
--查看列的長度
SELECT column_name AS 列名, data_type AS 數(shù)據(jù)類型, character_maximum_length AS 數(shù)據(jù)長度
FROM information_schema.columns
WHERE table_name = 'users' AND column_name = 'pwd';
如上,長度修改成功。?
4)對(duì)指定表添加默認(rèn)約束?
?這里以學(xué)生表students為例,向?qū)W生表中添加新列nation國籍?nvarchar(10),默認(rèn)值為“中國”。
ALTER TABLE studentsADD nation nvarchar(10) CONSTRAINT DF_students_nation DEFAULT('中國')
?通過上圖可以無法直觀的感受到默認(rèn)值的優(yōu)勢,后面插入數(shù)據(jù)的時(shí)候會(huì)更直觀。
ALTER TABLE courses ADD CONSTRAINT DF_courses_cte DEFAULT 'required_course' FOR cte
INSERT INTO dept(dno,dne,ddn,dpe)
VALUES('1','Computer','QiangguoGong','1531111111')INSERT INTO classes(cno,cne,ccr,dno)
VALUES('1','Computer24','JianjunSong','1')INSERT INTO students(sno,sne,ssx,sbd,spe,cno)
VALUES('1','zs','male','2000.1.1','18911111111','1')INSERT INTO courses(cno,cne,cpd,cct)
VALUES('1','SQLserver DataBase Application principle','96','6')INSERT INTO users(uln,une,upd)
VALUES('SQL_identity','sa','123456')
?3,使用DROP TABLE刪除表
?能夠創(chuàng)建表自然也就能夠刪除表。刪表的語法如下:
DROP TABLE 數(shù)據(jù)表名
有問題請(qǐng)?jiān)谠u(píng)論區(qū)留言或者是私信我,回復(fù)時(shí)間不超過1天。