一、約束
SQL約束(Constraints)是用于限制表中數據的規則,確保數據的完整性和準確性。以下是主要的SQL約束類型:
主要約束類型:
1. NOT NULL 約束: 確保列不能包含空值
CREATE TABLE users (id INT NOT NULL,name VARCHAR(50) NOT NULL
);
2. UNIQUE 約束:確保列中的所有值都是唯一的
CREATE TABLE users (id INT UNIQUE,email VARCHAR(100) UNIQUE
);
3. PRIMARY KEY 約束: 唯一標識表中的每一行 / 自動包含 NOT NULL 和 UNIQUE 約束
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50)
);
4. FOREIGN KEY 約束: 鏈接兩個表之間的數據 / 確保引用完整性
這是外鍵約束
FOREIGN KEY (user_id):指定 user_id 列作為外鍵
REFERENCES users(id):這個外鍵引用 users 表中的 id 列
CREATE TABLE orders (id INT PRIMARY KEY,user_id INT,FOREIGN KEY (user_id) REFERENCES users(id)
);
5.CHECK 約束: 確保列中的值滿足特定條件
CREATE TABLE products (id INT PRIMARY KEY,price DECIMAL(10,2) CHECK (price > 0),age INT CHECK (age >= 18 AND age <= 100)
);
6. DEFAULT 約束: 為列提供默認值
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,status VARCHAR(20) DEFAULT 'active'
);
約束管理:
1. 添加約束
-- 添加 NOT NULL 約束
ALTER TABLE users MODIFY COLUMN email VARCHAR(100) NOT NULL;-- 添加 UNIQUE 約束
ALTER TABLE users ADD CONSTRAINT uk_email UNIQUE (email);-- 添加 FOREIGN KEY 約束
ALTER TABLE orders ADD CONSTRAINT fk_user
FOREIGN KEY (user_id) REFERENCES users(id);-- 添加 CHECK 約束
ALTER TABLE products ADD CONSTRAINT chk_price
CHECK (price > 0);
2. 刪除約束
-- 刪除約束(通過約束名)
ALTER TABLE users DROP CONSTRAINT uk_email;
ALTER TABLE orders DROP CONSTRAINT fk_user;
ALTER TABLE products DROP CONSTRAINT chk_price;-- 刪除主鍵約束
ALTER TABLE users DROP PRIMARY KEY;
約束的好處
- 數據完整性:確保數據符合業務規則
- 數據一致性:維護數據之間的關系
- 防止錯誤數據:在數據插入/更新時進行驗證
- 提高查詢性能:某些約束(如主鍵、唯一約束)會自動創建索引
注意事項
- 約束在數據插入、更新時會進行檢查
- 違反約束的操作會被拒絕
- 外鍵約束可能影響刪除和更新操作
- 過多的約束可能影響寫入性能
SQL約束是數據庫設計中的重要組成部分,有助于維護數據質量和業務邏輯的正確性。
二、建表
-- 查看有哪些數據庫
SHOW DATABASES;
-- 假設要使用名為 'TestData' 的數據庫
USE TestData
-- 現在可以進行表操作了
CREATE TABLE empTest (id INT PRIMARY KEY, -- 員工id,主鍵且自增長ename VARCHAR(50) NOT NULL UNIQUE, -- 員工姓名,非空并且唯一join_date DATE NOT NULL, -- 入職日期, 非空salary DOUBLE(7,2) NOT NULL, -- 工資 非空bonus DOUBLE(7,2) DEFAULT 0, -- 獎金 非空 product_name VARCHAR(100) DEFAULT 0, -- 產品名稱 非空amount DECIMAL(10,2) -- 金額
);
-- 查看當前選擇的數據庫
SELECT DATABASE();
-- 查看當前數據庫中的所有表
SHOW TABLES;
-- 不選擇數據庫,直接指定
CREATE TABLE myshop.users (id INT PRIMARY KEY,name VARCHAR(50)
);