# Insert Data
# [Lecture] Section 4 Introduction
這一節主要介紹如何在表中插入資料?如何取得表中的資料?表格資料型態與警告?什麼是 NULL?
# [Lecture] Inserting Data
使用 INSERT INTO <tablename>() VALUES (); 來插入資料。
# [Lecture] CODE: Inserting Data
-- Insert Data
-- INSERT INTO table_name(column_name) VALUES (data);
INSERT INTO cats(name, age)
VALUES ('Jetson', 7);
# [Lecture] Super Quick Intro To SELECT
在後續的課程中我們將會學到可以使用 SELECT * FROM <tablename>; 來取得指定資料表中的資料。
# [Lecture] CODE: Super Quick Intro To SELECT
SELECT * FROM cats;
# Multiple INSERT
當我們要大量插入資料時,需要使用 , 將不同資料列分開:
INSERT INTO table_name
(column_name, column_name)
VALUES (value, value),
(value, value),
(value, value);
# [Exercise] INSERT
# Question
練習建置一個名為
people的資料表,包含三個欄位:first_name(20 char limit)last_name(20 char limit)age
插入一列資料
first_name last_name age 'Tina' 'Belcher' 13 插入一列資料
first_name last_name age 'Bob' 'Belcher' 42 插入多列資料
first_name last_name age 'Linda' 'Belcher' 45 'Phillip' 'Frond' 38 'Calvin' 'Fischoeder' 70
# Solution
-- Create Table
CREATE TABLE people
(
first_name VARCHAR(20),
last_name VARCHAR(20),
age INT
);
-- Insert Data
INSERT INTO people(first_name, last_name, age)
VALUES ('Tina', 'Belcher', 13);
INSERT INTO people(age, last_name, first_name)
VALUES (42, 'Belcher', 'Bob');
INSERT INTO people(first_name, last_name, age)
VALUES('Linda', 'Belcher', 45)
,('Phillip', 'Frond', 38)
,('Calvin', 'Fischoeder', 70);
-- Show Data
SELECT * FROM people;
# [Lecture] NOTE: MySQL Warnings
在下一小節中 Colt 將會介紹 MySQL 中的 警告(warnings),如果在過程中出現錯誤可以參考這篇問與答 Did anyone else get an error on section 4 lecture 51 instead of a warning?。
# [Lecture] MySQL Warnings
當插入資料不符合所設定的資料型態時,資料庫管理系統會回報 警告(warnings),使用 SHOW WARNINGS; 命令可以查看警告。
# [Lecture] CODE: MySQL Warnings
-- Check cats Table
DESC cats;
-- Try Inserting a cat with a super long name:
INSERT INTO cats(name, age)
VALUES('This is some text blah blah blah blah blah text text text something about cats lalalalal meowwwwwwwwwww', 10);
-- Show Warnings
SHOW WARNINGS;
# [Lecture] NULL and NOT_NULL
當我們檢查資料庫中某章資料表的內容時,會看到欄位有一個屬性叫作 NULL 如下所示:
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name | varchar(100) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
其中 NULL 的意思代表著未知的數值,而欄位的 NULL 屬性為 YES 表示插入一列資料時,某一欄可以是沒有資料的(若資料型態為整數,其值將為 0)。若要限制必須填入資料否則會回報警告時,必須在聲明變數型態時加入 NOT NULL:
CREATE TABLE cats2
(
name VARCHAR(100) NOT NULL,
age INT NOT NULL
);
# [Lecture] CODE: NULL and NOT NULL
沒有設定為 NOT NULL:
-- Create and Check Table
CREATE TABLE cats
(
name VARCHAR(100),
age INT
);
DESC cats;
-- Try inserting a cat without an age:
INSERT INTO cats(name) VALUES('Alabama');
SELECT * FROM cats;
-- Try inserting a nameless and ageless cat:
INSERT INTO cats() VALUES();
設定為 NOT NULL:
-- Create and Check Table
CREATE TABLE cats2
(
name VARCHAR(100) NOT NULL,
age INT NOT NULL
);
DESC cats2;
-- Try inserting an ageless cat:
INSERT INTO cats2(name) VALUES('Texas');
-- View the new warnings:
SHOW WARNINGS;
SELECT * FROM cats2;
-- Do the same for a nameless cat:
INSERT INTO cats2(age) VALUES(7);
SHOW WARNINGS;
# [Lecture] Setting Default Values
聲明資料型態時,對於插入時沒有給定內容的欄位可以透過 DEFAULT 設定預設值:
CREATE TABLE cats3
(
name VARCHAR(100) DEFAULT 'unnamed',
age INT DEFAULT 99
);
使用 DEFAULT 設定預設值時可能會和 NOT NULL 搭配使用,因為如果沒有特別聲明 NOT NULL 時,可以特別指定數值為 NULL:
CREATE TABLE cats4
(
name VARCHAR(100) NOT NULL DEFAULT 'unnamed',
age INT NOT NULL DEFAULT 99
);
# [Lecture] CODE: Setting Default Values
-- Define a table with a DEFAULT name specified:
CREATE TABLE cats3
(
name VARCHAR(20) DEFAULT 'no name provided',
age INT DEFAULT 99
);
DESC cats3;
-- Insert a nameless, ageless cat:
INSERT INTO cats3(age) VALUES(13);
INSERT INTO cats3() VALUES();
-- Combine NOT NULL and DEFAULT:
CREATE TABLE cats4
(
name VARCHAR(20) NOT NULL DEFAULT 'unnamed',
age INT NOT NULL DEFAULT 99
);
-- Notice The Difference:
INSERT INTO cats() VALUES();
SELECT * FROM cats;
INSERT INTO cats3() VALUES();
SELECT * FROM cats3;
INSERT INTO cats3(name, age) VALUES('Montana', NULL);
SELECT * FROM cats3;
INSERT INTO cats4(name, age) VALUES('Cali', NULL);
# Primary Keys
為了避免資料重複,我們會指派某一個欄位為 主鍵(Primary Key) 來進行區分,比如在申請帳號時,通常會將 username 設為主鍵來避免重複申請帳號。在聲明資料型態時可以透過 PRIMARY KEY (column_name) 來設定主鍵,在許多狀況下會將主鍵設置為一串編號,透過添加 AUTO_INCREMENT 標籤可以使資料庫添加資料列時自動進行編號。
-- Define a table with a PRIMARY KEY constraint:
CREATE TABLE unique_cats
(
cat_id INT NOT NULL,
name VARCHAR(100),
age INT,
PRIMARY KEY (cat_id)
);
DESC unique_cats;
-- Insert some new cats:
INSERT INTO unique_cats(cat_id, name, age) VALUES(1, 'Fred', 23);
INSERT INTO unique_cats(cat_id, name, age) VALUES(2, 'Louise', 3);
INSERT INTO unique_cats(cat_id, name, age) VALUES(1, 'James', 3);
SELECT * FROM unique_cats;
-- Adding in AUTO_INCREMENT:
CREATE TABLE unique_cats2 (
cat_id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100),
age INT,
PRIMARY KEY (cat_id)
);
-- INSERT a couple new cats:
INSERT INTO unique_cats2(name, age) VALUES('Skippy', 4);
INSERT INTO unique_cats2(name, age) VALUES('Jiff', 3);
INSERT INTO unique_cats2(name, age) VALUES('Jiff', 3);
INSERT INTO unique_cats2(name, age) VALUES('Jiff', 3);
INSERT INTO unique_cats2(name, age) VALUES('Skippy', 4);
SELECT * FROM unique_cats2;
# [Lecture] Table Constraints Exercise
創建一個名為 employees 的資料表,表中包含以下資料:
id- number(automatically increments), mandatory, primary keylast_name- text, mandatoryfirst_name- text, mandatorymiddle_name- text, not mandatoryage- number mandatorycurrent_status- text, mandatory, defaults to 'employed'
# [Lecture] Table Constraints Exercise Solution
詳見下一則筆記。
# [Lecture] CODE: Table Constraints Exercise Solution
設定主鍵的方式有兩種:
-- Solution 1
CREATE TABLE employees (
id INT AUTO_INCREMENT NOT NULL,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
middle_name VARCHAR(255),
age INT NOT NULL,
current_status VARCHAR(255) NOT NULL DEFAULT 'employed',
PRIMARY KEY(id)
);
-- Solution 2
CREATE TABLE employees (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
middle_name VARCHAR(255),
age INT NOT NULL,
current_status VARCHAR(255) NOT NULL DEFAULT 'employed'
);