在 Day11 的建立資料庫、資料表一文中,有使用到「新增資料表」和「新增資料」兩種 SQL 敘述。這篇主要是來講解這兩種敘述的使用方式和注意事項。
來建立一個新的 Employee 資料表吧,其中欄位和格式如下:
CREATE TABLE Employee
(id CHAR(5) NOT NULL,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
salary INTEGER DEFAULT 0,
birth_date DATE,
PRIMARY KEY(id)
);
SELECT * FROM Employee;
一般的情形下,每新增一筆資料,就得撰寫一次以下的 INSERT 敘述句語法。
INSERT INTO <TableName> (Field1, Field2, ...) VALUES(Content1, Content2,...)
在以上的敘述句中,欄位名稱和內容是彼此一一對應的。換言之,如果 Content1 填入的內容不符合 Field1 的規範,那就會出現錯誤。
舉例,若要在 Employee 資料表中新增兩筆資料,可以寫成:
INSERT INTO Employee (id,name,email,salary,birth_date)
VALUES('00001','Andy','andy@abc.com',40000,'1992-09-01');
INSERT INTO Employee (id,name,email,salary,birth_date)
VALUES('00002','Sandy','sandy@abc.com',42000,'1987-09-01');
SELECT * FROM Demo_Shop.Employee;
其中接在 Employee 後方 () 裡的內容,可當成「欄位串」;放在 VALUES 後方 () 裡的內容,可當成「內容值串」
當你要 INSERT 的欄位為全部時,你可以只寫 VALUES。不過依然是要照欄位的順序寫的,否則會報錯。
INSERT INTO Employee
VALUES('00003','Tom','tom@abc.com',38000,'1994-09-01');
SELECT * FROM Demo_Shop.Employee;
如果有這樣的情形發生,那麼該 INSERT 所欲造成的資料改變並不會成功。換言之,原先資料表內的資料是不會有影響的。
若在建立資料表時,有設定 DEFAULT 值的話,那麼在 INSERT INTO 時的寫法可以有兩種:
/*寫明欄位,其值為 DEFAULT*/
INSERT INTO Employee (id,name,email,salary,birth_date)
VALUES('00004','Cindy','cindy@abc.com',DEFAULT,'1993-09-01');
/*隱藏欄位和其對應值*/
INSERT INTO Employee (id,name,email,birth_date)
VALUES('00005','Jacky','jacky@abc.com','1993-09-01');
SELECT * FROM Demo_Shop.Employee;