這是線上平台課程的筆記內容,就是讓自己方便複習用。
老師講課的進度掌握得很好,教得也很淺寫易懂。
線上平台課程內有提供 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 是UNIQUE,name 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 (條件)
);
移除掉之前的表,現在開始新建。
多加一個欄位cost,int 條件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語句
如果筆記造成任何法律或者侵權的問題,作者會立即將筆記下架。
留言列表