close

這是線上平台課程的筆記內容,就是讓自己方便複習用。

老師講課的進度掌握得很好,教得也很淺寫易懂。

線上平台課程內有提供 SQL套件,如果有興趣的朋友一定要去支持老師的課程。

這樣才能取得老師提供的套件包做練習使用。

如果有想要知道老師的課程,再詢問我。


CH   表約束(限制)

 

NOT NULL約束

 

一個好的數據庫,重要的部份是要控制進入TABLE的數據。

最基本的控制就是,我要數字、文字、日期時間等。這也是約束。

 

要控制的原因是,你無法知道CODE怎麼寫,資料拋進來變甚麼樣子。

我們有哪些的約束

NOT NULL

不允許NULL

UNIQUE

這個值,必須是唯一值。

PRIMARY KEY

這是前兩者組合。

不可NULL,也必須唯一。

FOREIGN KEY

是檢查另外一個表中是否存在該值。

就是能否正確的撈回資料。

CHECK

值必須大於/小於該值。

不允許不滿足條件的數值

DEFAULT

默認值。不輸入就是這個

 

NOT NULL開始。

在設計TABLE的時候,就會在這個欄位後面帶上

CREATE TABLE table_name(

欄位1 datetype NOT NULL

)

 

重新創建一個表,他的一個欄位必須是NOT NULL

CREATE TABLE practice

    practiced int NOT NULL

);

LAB 把剛剛那張表DROP掉。再重新建立,

並增加practice_field var(50)

DROP TABLE practices;

CREATE TABLE practices(

    practiced int NOT NULL,

    practice_field varchar(50) NOT NULL

);

!!DATATYPE納編紙等var(50)不行的,要打varhar(50)

 


有時候表已經設定下去了,事後才想到要給他NOT NULL

我們可以透過ALTER來達成。

 

ALTER TABLE table_name

ALTER COLUMN 欄位 SET NIT NULL;

 

DROP TABLE practices;

CREATE TABLE practices(

    practiced int NOT NULL,

    practice_field varchar(50)

);

 

ALTER TABLE practices

ALTER COLUMN practice_field SET NOT NULL;

 

LAB employees表當中的lastname那邊改成NOT NULL

 

ALTER TABLE employees

ALTER COLUMN lastname SET NOT NULL;

 


UNIQUE的約束

 

語法是一樣的。

CREATE TABLE table_name(

欄位1  datatype UNIQUE

);

 

practiceid希望欄位是唯一的,不希望有同樣編號的ID被輸入。

 

DROP TABLE practices;

CREATE TABLE practices(

    practiceid int UNIQUE,

    practice_field varchar(50) NOT NULL

);

 

 

 

LAB 建立一張Pet的表。

Petid UNIQUEname varchar(25)NOT NULL

CREATE TABLE pet(

    petid int UNIQUE,

    name varchar(25) NOT NULL

);

 

改變region這張表

!! 要改變成UNIQUE比較不一樣,要換個參數

 

ALTER TABLE table_name

ADD CONSTRAINT some_name UNIQUE(欄位);

 

ALTER TABLE region

ADD CONSTRAINT regiondescription_region UNIQUE(regiondescription);

 

LAB 修改companyname讓他變成唯一值。

ALTER TABLE shippers

ADD CONSTRAINT shipper_companyname UNIQUE(companyname);

 

 


主鍵(PrimaryKey)

 

CREATE TABLE table_name

欄位1 datatype PRIMARY KEY

)

 

或者你要直接給NOT NULL + UNIQUE也可以。

 

practices做練習。

DROP TABLE practices;

CREATE TABLE practices(

    practiceid int PRIMARY KEY,

    practice_field varchar(50) NOT NULL

);

 

INSERT INTO practices (practiceid, practice_field)

VALUES (null,'something');

這邊就跟你說,不能夠是NULL

 

INSERT INTO practices (practiceid, practice_field)

VALUES (1,'something');

 

 

第二次給一樣的practiceid會得到錯誤。

錯誤訊息都很清楚了。

 

回到pets表,把petid設定為Primary KEY

CREATE TABLE pets(

    petid int PRIMARY KEY,

    name varchar(25) NOT NULL

);

 

 

修改值變成PrimaryKey

新增

ALTER TABLE table_name

ADD PRIMARY KEY (欄位);

 

移除

ALTER TABLE table_name

DROP CONSTRAINT table_name_pkey;

先練習拿掉PKey

 

 

新增回去

ALTER TABLE practices

ADD PRIMARY KEY (practiceid);

 

 


外鍵Forienge KEY

 

CREATE TABLE table_name(

欄位1 datatype,

欄位2 datatype,

…,

FOREIGN KEY (欄位名稱) REFERENCES table2_name (欄位)

)

 

先刪掉練習表,再建立一次。

新稱員工欄位

 

DROP TABLE practices;

CREATE TABLE practices(

    practiceid int PRIMARY KEY,

    practice_field varchar(50) NOT NULL,

    employeeid int NOT NULL,

    FOREIGN KEY (employeeid) REFERENCES employees(employeeid)

);

 

 


LAB 重建pets表,加入外鍵customerid customers表。

DROP TABLE pets;

CREATE TABLE pets(

    petid int PRIMARY KEY,

    name varchar(25) NOT NULL,

        customerid char(5) NOT NULL,

        FOREIGN KEY (customerid) REFERENCES customers(customerid)

);

 

這邊選錯DATATYPE 結果造成建立失敗。

這邊說了,兩邊的DATATYPE格是不合造成無法做外鍵。

 


我們也可以對現在存在的表作調整。

ALTER TABLE table_name

ADD CONSTRAINT constraint_name

FOREIGN KEY (欄位) REFERENCES table2(欄位);

 

移除

ALTER TABLE table

DROP CONSTAINT constraint_name

 

Constraintname  >> TABLE_欄位_fkey

 

練習刪除

ALTER TABLE practices

DROP CONSTRAINT practices_employeeid_fkey;

ALTER TABLE practices

ADD CONSTRAINT practices_employeeid_fkey

FOREIGN KEY (employeeid) REFERENCES employees (employeeid);


LAB 練習PET

ALTER TABLE pets

DROP CONSTRAINT pets_customerid_fkey;

 

ALTER TABLE pets

ADD CONSTRAINT pets_customerid_fkey

FOREIGN KEY (customerid) REFERENCES customers(customerid);

 


檢查約束 CHECK

檢查條件,有沒有符合,有符合才能寫入。

 

CREATE TABLE table_name(

欄位1 datatype,

欄位2 datatype CONSTAINT name CHECK (條件),

CONSTAINT name CHECK (條件)

);

移除掉之前的表,現在開始新建。

多加一個欄位costint 條件BETWEEN 0 AND 1000

 

DROP TABLE practices;

CREATE TABLE practices(

    practiceid int PRIMARY KEY,

    practice_field varchar(50) NOT NULL,

    employeeid int NOT NULL,

    cost int CONSTRAINT practice_cost  CHECK (cost >= 0 AND cost <1000),

    FOREIGN KEY (employeeid) REFERENCES employees(employeeid)

);

 

INSERT INTO practices

(practiceid, practice_field, employeeid, cost)

VALUES

(1, 'FIRST',1,1000);

正常值OK

 

 

INSERT INTO practices

(practiceid, practice_field, employeeid, cost)

VALUES

(1, 'FIRST',1,1001);

這邊跟你說,值超過了。

 

LAB 加上體重欄位

DROP TABLE pets;

CREATE TABLE pets(

    petid int PRIMARY KEY,

    name varchar(25) NOT NULL,

        customerid char(5) NOT NULL,

    weight int CONSTRAINT pet_weight CHECK (weight > 0 AND weight <=200),

        FOREIGN KEY (customerid) REFERENCES customers(customerid)

);

 

如果我們要ALTER修改呢。

 

ALTER TABLE table_name

ADD CONSTRAINT constraint_name

CHECKS (條件);

 

ALTER TABLE table_name

DROP CONSTARINT constraint_name;

 

 

 

新增一個條件orders ( freight >0 )

 

ALTER TABLE orders

ADD CONSTRAINT orders_freight CHECK (freight > 0);

 

 

LAB 讓產品的單價不低於0

ALTER TABLE products

ADD CONSTRAINT products _ unitprice CHECK (unitprice > 0);

 


默認約束

這邊可以給一個固定值,或者用一個函式來運行

DEFAULT

CREATE TABLE table_name(

欄位1  datatype,

欄位2  datatype DEFAULT value/function,

);

 

DROP TABLE practices;

CREATE TABLE practices(

    practiceid int PRIMARY KEY,

    practice_field varchar(50) NOT NULL,

    employeeid int NOT NULL,

    cost int DEFAULT 50 CONSTRAINT practice_cost  CHECK (cost >= 0 AND cost <1000),

    FOREIGN KEY (employeeid) REFERENCES employees(employeeid)

);

 

 

LAB 體重不小於五公斤

 

DROP TABLE pets;

CREATE TABLE pets(

    petid int PRIMARY KEY,

    name varchar(25) NOT NULL,

customerid char(5) NOT NULL,

    weight int DEFAULT 5 CONSTRAINT pet_weight CHECK (weight > 0 AND weight <=200),

FOREIGN KEY (customerid) REFERENCES customers(customerid)

);

 


ALTER修改

ALTER TABLE table_name

ALTER COLUMN 欄位

SET DEFAULT value;

 

ALTER TABLE table_name

ALTER COLUMN 欄位

DROP DEFAULT;

 

 

我們讓shipvia DEFAULT 1

 

ALTER TABLE orders

ALTER COLUMN shipvia

SET DEFAULT 1;

 

 

products內的recordlevel 預設為5

 

ALTER TABLE products

ALTER COLUMN reorderlevel

SET DEFAULT 5;

基本上線上課程就教到這邊,後續的部分就得要自己再努力鑽研!!

<本系列完>

 

 


第一篇:  IT讀書室-SQL語法學習- postgre安裝與匯入

第二篇:  IT讀書室-SQL語法學習- SELECT查詢

第三篇:  IT讀書室-SQL語法學習- WHERE條件

第四篇:  IT讀書室-SQL語法學習- 中間的SELECT語句

 


如果筆記造成任何法律或者侵權的問題,作者會立即將筆記下架。

 

 

 

arrow
arrow
    全站熱搜

    IT001 發表在 痞客邦 留言(0) 人氣()