SQLite 入门教程三 好多约束 Constraints
在SQLite中,可以使用约束(Constraints)来保证表中数据的完整性和一致性。本教程将详细介绍SQLite数据库中支持的主要约束类型。
1. NOT NULL
使用NOT NULL
约束可以保证指定的列必须有值,而不能为NULL(即空值)。以下是一个实例:
CREATE TABLE Students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age INTEGER NOT NULL
);
上述示例中,表Students
中的name
和age
列都使用了NOT NULL
约束,这意味着在插入数据时必须为这两个列赋值(不能为NULL)。
2. UNIQUE
使用UNIQUE
约束可以保证指定的列中的每个值都是唯一的,即不能重复。以下是一个实例:
CREATE TABLE Users (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL
);
上述示例中,表Users
中的username
列使用了UNIQUE
约束,这将保证每行数据中的username
列都是唯一的。
3. PRIMARY KEY
使用PRIMARY KEY
约束可以将指定的列设置为主键列,主键列的值必须是唯一的。通常情况下,使用INTEGER
类型的列作为主键,且设定为自增长。以下是一个实例:
CREATE TABLE Members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
gender TEXT NOT NULL
);
上述示例中,表Members
中的id
列设定为主键列,并且使用AUTOINCREMENT
选项将其设定为自增长(即每插入一条记录,id
列的值都会自动增加)。这将保证每行数据中的id
列都是唯一的。
4. CHECK
使用CHECK
约束可以在插入或更新数据时,对指定的列加以限制,要求其在某些特定的条件下才能插入或更新。以下是一个实例:
CREATE TABLE Books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price REAL NOT NULL CHECK(price > 0)
);
上述示例中,表Books
中的price
列使用了CHECK
约束,这将保证price
列的值必须大于0。如果尝试插入price
小于或等于0的行,则会出现“插入异常”(insertion anomaly)。
5. FOREIGN KEY
使用FOREIGN KEY
约束可以将一张表中的列与另一张表中的列进行关联,从而保证数据的完整性和一致性。以下是一个实例:
CREATE TABLE Orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
FOREIGN KEY(customer_id) REFERENCES Customers(id),
FOREIGN KEY(product_id) REFERENCES Products(id)
);
上述示例中,表Orders
中的customer_id
和product_id
列均使用了FOREIGN KEY
约束,这将保证customer_id
和product_id
列中的值必须是关联表Customers
和Products
中的某个id
值。如果当前表中插入了一个非法值,则会出现“插入异常”(insertion anomaly)。
示例1: 使用 UNQIUE 保证唯一性
假如我们现在需要创建一张账单表,里面有账单ID、账单的编号、和账单的总金额,其中账单编号需要保证唯一性。可以通过在表的创建语句中使用 UNIQUE
约束来实现。
CREATE TABLE bills (
id INTEGER PRIMARY KEY,
bill_num TEXT UNIQUE,
amount REAL NOT NULL
);
上述示例中,表bills
中的bill_num
列使用了UNIQUE
约束,这将保证bill_num
列中的值必须是唯一的。如果尝试插入一个bill_num
值已存在的行,则会出现“插入异常”(insertion anomaly)。
示例2:使用 CHECK 检查数据的范围
我们想在表中创建一个单笔转账记录,里面有源账户名称、源账户余额、目标账户名称、目标账户余额、转账金额等。现在需要限制转账金额必须在源账户的余额范围之内,同时目标账户的余额也要发生改变。可以通过在表的创建语句中使用 CHECK
约束来实现。
CREATE TABLE transfers (
id INTEGER PRIMARY KEY,
source_name TEXT NOT NULL,
source_balance REAL NOT NULL,
target_name TEXT NOT NULL,
target_balance REAL NOT NULL,
amount REAL NOT NULL CHECK(amount > 0 AND amount <= source_balance),
FOREIGN KEY(source_name) REFERENCES accounts(name),
FOREIGN KEY(target_name) REFERENCES accounts(name)
);
上述示例中,表transfers
中的amount
列使用了CHECK
约束,这将保证amount
列中的值必须大于0并且小于等于source_balance
列中的值。如果尝试插入一个amount
值不在合法范围内的行,则会出现“插入异常”(insertion anomaly)。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQLite 入门教程三 好多约束 Constraints - Python技术站