当前位置: 首页 > news >正文

第3节-使用表格数据-唯一约束

摘要: 在本教程中,你将学习如何使用 PostgreSQLUNIQUE 约束来确保特定列或列组合中的所有值在整个表中都是唯一的。

PostgreSQL UNIQUE 约束简介

PostgreSQL 中,你可以使用 UNIQUE 约束来确保一列或多列组合中的所有值在整个表中都是唯一的。

以下是定义 UNIQUE 约束的语法:

CREATE TABLE table_name (column1 data_type CONSTRAINT constraint_name UNIQUE,...
);

在该语法中:

首先,为 UNIQUE 约束指定约束名称。当你向表中插入或更新一个值为表中已存在的新值时,PostgreSQL 会发出包含该约束名称的错误。这个约束名称有助于你更快地发现问题所在。

请注意,CONSTRAINT constraint_name 是可选的。如果省略它,PostgreSQL 会按照以下格式自动生成一个约束名称:

{table_name}_{column_name}_key

其次,使用 UNIQUE 关键字告知 PostgreSQL ,你将要为该列创建一个 UNIQUE 约束。

这种语法会创建一个列约束,因为我们将其定义为列定义的一部分。

你可以将 UNIQUE 约束定义为表约束:

CREATE TABLE table_name (column1 data_type,...,CONSTRAINT constraint_name UNIQUE
);

在这种语法中,我们在列列表之后定义 UNIQUE 约束。

实际上,当包含两个或多个列时,你通常会定义一个 UNIQUE 表约束:

CREATE TABLE table_name (column1 data_type,column2 data_type,CONSTRAINT constraint_name UNIQUE (column1, column2)
);

定义包含一个列的 UNIQUE 约束

首先,创建一个名为 brands 的表来存储 brands:

CREATE TABLE brands (brand_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,name VARCHAR(255) NOT NULL UNIQUE
);

这个 brands 表中的 name 名称列具有唯一约束。这意味着 name 名称列中不会有重复值。

如果您插入的品牌已存在于 brands 表中,PostgreSQL 会通过抛出错误来处理,以确保数据完整性。

其次,向 brands 表中插入一个新行:

INSERT INTObrands (name)
VALUES('Apple') 
RETURNING *;

输出:

 brand_id | name
----------+-------1 | Apple

第三,尝试再次将 Apple 品牌插入到 brands 表中:

INSERT INTObrands (name)
VALUES('Apple') 
RETURNING *;

PostgreSQL 发出了以下错误:

ERROR: duplicate key value violates unique constraint "brands_name_key"

该错误意味着你正尝试在 brands 表的 name 列中插入一个已存在的值,这违反了唯一约束 brands_name_key

定义包含多列的 UNIQUE 约束

首先,创建一个表 product_loans 来存储产品 product 表:

CREATE TABLE product_loans (loan_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,product_id INT NOT NULL,user_id INT NOT NULL,loan_date DATE NOT NULL,return_date DATE,UNIQUE (product_id, user_id)
);

此示例定义了一个包含 UNIQUE 约束的 product_iduser_id 列。

其次,向 product_loans 表中插入行:

INSERT INTOproduct_loans (product_id, user_id, loan_date)
VALUES(1, 1, '2024-11-23'),(1, 2, '2024-11-23') 
RETURNING *;

输出:

 loan_id | product_id | user_id | loan_date  | return_date
---------+------------+---------+------------+-------------1 |          1 |       1 | 2024-11-23 | NULL2 |          1 |       2 | 2024-11-23 | NULL

第三,尝试插入一行新数据,其中 product_iduser_id 列的值均为重复值:

INSERT INTOproduct_loans (product_id, user_id, loan_date)
VALUES(1, 1, '2024-11-24');

错误:

duplicate key value violates unique constraint "product_loans_product_id_user_id_key"

使用 UNIQUE 约束处理 NULL

PostgreSQL 中,NULL 与另一个 NULL 不同。因此,你可以在具有 UNIQUE 约束的列中插入多个 NULL 。例如:

首先,创建一个名为 profiles 的表来存储用户资料:

CREATE TABLE profiles (user_id INT PRIMARY KEY,first_name VARCHAR(50) NOT NULL,last_name VARCHAR(50) NOT NULL,phone VARCHAR(25) UNIQUE
);

phone 列可为空且具有 UNIQUE 约束。

其次,向 profiles 表中插入一行新数据:

INSERT INTOprofiles (user_id, first_name, last_name, phone)
VALUES(1, 'John', 'Doe', NULL) 
RETURNING *;

输出:

 user_id | first_name | last_name | phone
---------+------------+-----------+-------1 | John       | Doe       | NULL

第三,尝试向 profiles 表中插入一行新数据,其中 phone 列的值为 NULL :

INSERT INTOprofiles (user_id, first_name, last_name, phone)
VALUES(2, 'Jane', 'Doe', NULL) 
RETURNING *;

输出:

 user_id | first_name | last_name | phone
---------+------------+-----------+-------2 | Jane       | Doe       | NULL

最后,从 profiles 表中查询数据:

SELECT * FROM profiles;

输出:

 user_id | first_name | last_name | phone
---------+------------+-----------+-------1 | John       | Doe       | NULL2 | Jane       | Doe       | NULL

总结

  • 利用 PostgreSQLUNIQUE 约束确保一个或多个列中的值在同一表内是唯一的。

文章转载自:

http://rbKIV7Eu.ddxjr.cn
http://yFiqdnII.ddxjr.cn
http://9MLbYjNC.ddxjr.cn
http://IGmeHcxE.ddxjr.cn
http://7xUrvvtO.ddxjr.cn
http://nn3UHoFh.ddxjr.cn
http://v2JuWEAW.ddxjr.cn
http://bCS3J7bS.ddxjr.cn
http://AtnS10Vi.ddxjr.cn
http://O24x8lRy.ddxjr.cn
http://9BkhulZl.ddxjr.cn
http://hQZucllZ.ddxjr.cn
http://x8tA3sRn.ddxjr.cn
http://kxBg79gY.ddxjr.cn
http://89zB9PUz.ddxjr.cn
http://BIaAvOSy.ddxjr.cn
http://gMQVzwtU.ddxjr.cn
http://HT3l8wJt.ddxjr.cn
http://1MnRGs7O.ddxjr.cn
http://bgkScSGu.ddxjr.cn
http://84Uetl6Z.ddxjr.cn
http://3gMJC5Kj.ddxjr.cn
http://aqkwvmUz.ddxjr.cn
http://eE5p2fyD.ddxjr.cn
http://l1ci9PyR.ddxjr.cn
http://YvF9MXb4.ddxjr.cn
http://zrMPu6dP.ddxjr.cn
http://SgbmRWCO.ddxjr.cn
http://5WCRJNIb.ddxjr.cn
http://bosqCz6c.ddxjr.cn
http://www.dtcms.com/a/379038.html

相关文章:

  • 深入浅出 C++20:新特性与实践
  • Java 面向对象三大核心思想:封装、继承与多态的深度解析
  • 蚁群算法详解:从蚂蚁觅食到优化利器
  • 星链计划 | 只赋能、不竞争!蓝卓“数智赋能·星链共生”重庆站沙龙成功举办
  • JavaScript 数组对象的属性、方法
  • vscode选择py解释器提示环境变量错误
  • 【2】标识符
  • Futuring robot旗下家庭机器人F1将于2025年面世
  • HTTPS 错误解析,常见 HTTPS 抓包失败、443 端口错误与 iOS 抓包调试全攻略
  • 利用数据分析提升管理决策水平
  • OC-KVC
  • Linux系统编程—基础IO
  • 考研408计算机网络2023-2024年第33题解析
  • 手眼标定之已知同名点对,求解转换RT,备份记录
  • 《MySQL事务问题与隔离级别,一篇讲透核心考点》
  • 水泵自动化远程监测与控制的御控物联网解决方案
  • Bug排查日记的技术
  • AR眼镜:化工安全生产的技术革命
  • 跨越符号的鸿沟——认知语义学对人工智能自然语言处理的影响与启示
  • 深入理解大语言模型(5)-关于token
  • Node.js-基础
  • JVM垃圾回收的时机是什么时候(深入理解 JVM 垃圾回收时机:什么时候会触发 GC?)
  • Python 版本和Quantstats不兼容的问题
  • SFINAE
  • TCP 三次握手与四次挥手
  • 【iOS】UIViewController生命周期
  • 硬件开发(7)—IMX6ULL裸机—led进阶、SDK使用(蜂鸣器拓展)、BSP工程目录
  • 人工智能学习:Transformer结构中的编码器层(Encoder Layer)
  • RISCV中PLIC和AIA的KVM中断处理
  • 掌握梯度提升:构建强大的机器学习模型介绍