以下是创建和使用域类型的一些示例:
创建域类型
-- 创建一个域类型,限制字符串长度在 1 到 50 之间
CREATE DOMAIN username VARCHAR(50) NOT NULL CHECK (LENGTH(VALUE) BETWEEN 1 AND 50);
-- 使用域类型的表
CREATE TABLE user_account (
user_id SERIAL PRIMARY KEY,
username username,
email VARCHAR(255)
);
-- 插入数据
INSERT INTO user_account (username, email) VALUES
('john_doe', 'john@example.com');
在上述示例中,username 是一个域类型,它对应的实际数据类型是 VARCHAR(50),并且添加了额外的约束条件,确保长度在 1 到 50 之间。
插入和查询
-- 尝试插入不符合约束条件的数据
INSERT INTO user_account (username, email) VALUES
('', 'alice@example.com'); -- 这将会失败
-- 查询数据
SELECT * FROM user_account;
在上述插入语句中,尝试插入一个空字符串到 username 列,由于域类型的约束,这将会失败。查询数据时,可以看到只有符合约束的数据被插入。
更复杂的约束
你还可以使用域类型添加更复杂的约束,例如正则表达式、范围限制等,以确保数据的完整性。
-- 创建一个域类型,限制邮箱地址格式
CREATE DOMAIN email_address VARCHAR(255) CHECK (VALUE ~* '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');
-- 使用域类型的表
CREATE TABLE person_with_email (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
email email_address
);
-- 插入数据
INSERT INTO person_with_email (name, email) VALUES
('John', 'john@example.com');
-- 尝试插入不符合邮箱格式的数据
INSERT INTO person_with_email (name, email) VALUES
('Alice', 'invalid_email'); -- 这将会失败
在这个示例中,email_address 是一个域类型,它对应的实际数据类型是 VARCHAR(255),并添加了一个约束条件,确保值符合特定的邮箱地址正则表达式。
通过使用域类型,你可以在数据库模型中引入更高层次的抽象,使得数据更易于理解和维护。
转载请注明出处:http://www.zyzy.cn/article/detail/8166/PostgreSQL