建立好資料庫跟資料表,下一步我們要做什麼呢?還記得吧!
資料庫設計有三個流程,分別是(1)是什麼(2)要幹嘛(3)怎麼做
其中第二步”要幹嘛"的階段,我們探討出想要儲存地區的資料,
也就是本篇主題,寫入資料。
複習一下 Day 08 建立資料表,我們接下來要把資料寫入這張資料表(Table)當中。
CREATE TABLE districts (
name VARCHAR(50),
country VARCHAR(50),
population INTEGER,
move_in INTEGER,
move_out INTEGER,
);
INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);
-- 寫入一筆資料
INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('斗六市', '雲林縣', 107598, 384, 335);
-- 寫入三筆資料
INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('斗六市', '雲林縣', 107598, 384, 335);
INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('虎尾鎮', '雲林縣', 70300, 305, 194);
INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('斗南鎮', '雲林縣', 43339, 124, 91);
-- 寫入多筆資料可以使用逗號(,)來進行縮寫
INSERT INTO districts(name, country, population, move_in, move_out)
VALUES ('斗六市', '雲林縣', 107598, 384, 335),
('虎尾鎮', '雲林縣', 70300, 305, 194),
('斗南鎮', '雲林縣', 43339, 124, 91);
寫入之後已經可以透過VSCode資料表(table)的放大鏡圖示看到資料了 (show table records)
我們可以透過工具,如VSCode提供的功能來查看資料,但是每個工具方法可能都不一樣,像是要在哪裡按哪個圖示,不熟悉的情況會造成使用上的一點點小困擾,另外一種查看資料的方式就是使用SQL語法,SELECT是SQL當中非常重要的指令,因為在整個使用資料庫的過程中,這個指令要非常頻繁的被使用,我們可以透過以下指令來取得資料:
SELECT * FROM districts;
我們要儲存的資料並不想接受任意值,而是只接受固定幾個值,ENUM正式為此而生,
以機台狀態為例,我們有定義好的狀態閒置(IDLE)、運作(RUN)等待(WAIT)、
保養(PM)、驗證(CORR)、異常(DOWN),可以透過定義特殊類別來進行枚舉(ENUM)。
CREATE TYPE tools_status AS ENUM ('IDLE','RUN','WAIT','PM','CORR','DOWN');
CREATE TABLE tools (
name VARCHAR(200),
status tools_status
);
實驗一下,寫入不允許的資料,結果會是如何呢?
INSERT INTO tools (name, status)
VALUES ('M43TS001','PMT');
這個Query語句被系統指出錯誤,輸入的值不被接受,結果如預期。
現在我們再來寫入被枚舉(ENUM)的值,結果會是如何呢?
INSERT INTO tools (name, status)
VALUES ('M43TS001','PM');
結果如預期,我們學會了透過這個方式來限制資料庫能寫入的資料。
另外一個議題是資料驗證是否由後端檢查就行了?資料庫有需要搞ENUM嗎?
沒有標準答案,不同組織不同的工作分配及系統規劃,我自己是較少使用這個功能,
不過資料庫的應用並不是只有後端程式、也可能是數據分析的資料匯入,
那就必須靠ENUM去卡控了:)
機台測試良率需要被精準的儲存,因此不選用REAL,
而是使用NUMERIC資料型別來儲存,
寫入資料之後再查詢結果是否如預期?
-- NUMERIC 能夠儲存精準的帶有小數的數字
CREATE TABLE tools_yield (
name VARCHAR(200),
-- yield REAL,
yield NUMERIC(5,2)
);
INSERT INTO tools_yield (name, yield)
VALUES ('M43TS001', 89.52);
欸世聰所以你說那個誰誰誰其實是已經結婚了嗎? 真的假的!
當我們儲存的資料只會有真或假兩個結果的時候,使用BOOLEAN。
CREATE TABLE employees (
name VARCHAR(200),
is_marry BOOLEAN
);
INSERT INTO employees (name, is_marry)
VALUES ('孫小美', TRUE),
('小丹尼', FALSE);
時間就是金錢,每個男人心中都希望能有一個時間暫停的忍術,好好的充實自己。
資料庫無法完成這個忍術,但是能夠把時間紀錄下來,使用TIMESTAMP。
CREATE TABLE watch_movies(
name VARCHAR(200),
start_at TIMESTAMP,
end_at TIMESTAMP
);
INSERT INTO watch_movies(name, start_at, end_at)
VALUES ('醍醐味豬腳飯的逆襲紀錄片','2022-09-09 09:09:09', '2022-09-09 09:12:09'),
('誇張好吃的火雞肉飯紀錄片','2022-09-09 09:12:09', '2022-09-09 09:12:12');
TIMESTAMP內建處理時區問題,因此不必設置時區,只需要輸入當地時間,
會由PostgreSQL自動轉換UTC儲存。
資料庫雖然有儲存檔案的資料類別,但是通常我們並不把檔案儲存在資料庫當中,
而是儲存於某個伺服器的某個資料夾內,然後把檔案的路徑儲存到資料庫當中。
備註 : 檔案儲存的路徑通常由程式設計師所規劃。
CREATE TABLE images (
image_path VARCHAR(200);
)
// 我們只儲存檔案的路徑
INSERT INTO images(image_path)
VALUES ('uploads/images/user001.jpg');