天道酬勤,学无止境

可延迟,不区分大小写的唯一约束(Deferrable, case-insensitive unique constraint)

问题

在PostgreSQL中是否可以在字符列上创建可延迟的唯一约束,但不区分大小写?

让我们假设下面的基本表:

CREATE TABLE sample_table ( 
   my_column VARCHAR(100)
);

如果不需要可延迟的约束,则就像使用函数创建唯一索引一样简单,例如:

CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column));

延迟约束检查需要显式创建约束,例如:

ALTER TABLE sample_table 
 ADD CONSTRAINT my_unique_constraint UNIQUE(my_column)
 DEFERRABLE INITIALLY IMMEDIATE;

不幸的是,不可能在唯一约束中使用任意函数。

一种可能的解决方法是创建与my_column内容相同的其他列,但大写形式在每次更新/插入后通过触发器进行更新,然后在此人工列上创建可延迟的唯一约束。 但是,这听起来确实很丑陋。

或者,应该可以使用CREATE CONSTRAINT TRIGGER并手动检查不区分大小写的唯一性(当然,仍然需要常规索引)。 对于这样一个简单的需求(我想很受欢迎),这听起来有些复杂。

有没有更简单和/或更优雅的方法来解决此限制?

回答1

您可以使用同名附加模块提供的特殊类型citext来规避该限制。 引用手册:

citext模块提供了不区分大小写的字符串类型citext。 本质上,当比较值时,它在内部调用lower。 否则,它的行为几乎与text完全一样。

它完全可以解决您的情况。 每个数据库运行一次:

CREATE EXTENSION citext;

那么你就可以:

CREATE TABLE sample_table ( 
   my_column citext
  ,CONSTRAINT my_unique_constraint UNIQUE(my_column)
   DEFERRABLE INITIALLY IMMEDIATE
);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 约束定义的“可立即初始化”是否仍被延迟?(Constraint defined DEFERRABLE INITIALLY IMMEDIATE is still DEFERRED?)
    问题 关于这个答案,我偶然发现了一个我无法解释的现象。 版本: x86_64-unknown-linux-gnu上的PostgreSQL 9.1.2,由gcc-4.4.real(Debian 4.4.5-8)4.4.5,64位编译 测试平台: CREATE TEMP TABLE t ( id integer , txt text , CONSTRAINT t_pkey PRIMARY KEY (id) DEFERRABLE INITIALLY IMMEDIATE ); INSERT INTO t VALUES (1, 'one') , (2, 'two'); 1) UPDATE语句修改多行: UPDATE t SET id = t_old.id FROM t t_old WHERE (t.id, t_old.id) IN ((1,2), (2,1)); 上面的UPDATE可以正常运行,尽管它预期不会这样做。 该约束定义为INITIALLY IMMEDIATE ,我没有使用SET CONSTRAINTS 。 我是否缺少某些东西,或者这是一个(无害的)错误? 2)数据修改CTE 因此,修改CTE的数据也可以工作。 虽然它失败并显示NOT DEFERRED pk: WITH x AS (UPDATE t SET id = 1 WHERE id = 2) UPDATE t SET id =
  • 用ORDER BY更新(UPDATE with ORDER BY)
    问题 需要使用ORDER BY来“绑定” UPDATE 。 我正在尝试使用游标,但出现错误: cursor "cursupd" doesn't specify a line, SQL state: 24000 代码: BEGIN; DECLARE cursUpd CURSOR FOR SELECT * FROM "table" WHERE "field" = 5760 AND "sequence" >= 0 AND "sequence" < 9 ORDER BY "sequence" DESC; UPDATE "table" SET "sequence" = "sequence" + 2 WHERE CURRENT OF cursUpd; CLOSE cursUpd; COMMIT; 如何正确做? 更新1 没有光标时,我这样做: UPDATE "CableLinePoint" AS "t" SET "sequence" = t."sequence" + 2 from ( select max("sequence") "sequence", "id" from "CableLinePoint" where "CableLine" = 5760 group by "id" ORDER BY "sequence" DESC ) "s" where "t"."id" = "s"."id"
  • 不区分大小写的array_unique(case-insensitive array_unique)
    问题 我试图写几行代码以使不区分大小写的数组唯一类型函数。 这是我到目前为止的内容: foreach ($topics as $value) { $lvalue = strtolower($value); $uvalue = strtolower($value); if (in_array($value, $topics) == FALSE || in_array($lvalue, $topics) == FALSE || in_array($uvalue, $topics) == FALSE) { array_push($utopics, $value); } } 麻烦的是if语句。 我认为我的语法有问题,但是我对PHP还是比较陌生,我不确定它是什么。 有什么帮助吗? 回答1 function array_iunique( $array ) { return array_intersect_key( $array, array_unique( array_map( "strtolower", $array ) ) ); } 回答2 您要将lvalue和uvalue lvalue都设置为小写版本。 $uvalue = strtolower($value); 应该 $uvalue = strtoupper($value); 也就是说,这可能会更快一些。 您的函数的性能将呈指数级下降
  • Deferrable, case-insensitive unique constraint
    Is it possible in PostgreSQL to create a deferrable unique constraint on a character column, but case-insensitive? Let's assume the following basic table: CREATE TABLE sample_table ( my_column VARCHAR(100) ); If deferrable constraint is not needed, it is as simple as creating unique index with function, e.g.: CREATE UNIQUE INDEX my_unique_index ON sample_table(UPPER(my_column)); Deferred constraint check requires creating the constraint explicitly, e.g.: ALTER TABLE sample_table ADD CONSTRAINT my_unique_constraint UNIQUE(my_column) DEFERRABLE INITIALLY IMMEDIATE; And unfortunately it is not
  • Rails模型中不区分大小写的搜索(Case-insensitive search in Rails model)
    问题 我的产品型号包含一些物品 Product.first => #<Product id: 10, name: "Blue jeans" > 我现在要从另一个数据集中导入一些产品参数,但是名称的拼写不一致。 例如,在另一个数据集中,“ Blue jeans可以拼写为“ Blue Jeans 。 我想要Product.find_or_create_by_name("Blue Jeans") ,但这将创建一个新产品,几乎与第一个相同。 如果我想查找和比较小写的名字,该怎么办? 性能问题在这里并不是真正重要的:只有100-200种产品,我想将其作为导入数据的迁移来运行。 有任何想法吗? 回答1 您可能需要在这里更加详细 name = "Blue Jeans" model = Product.where('lower(name) = ?', name.downcase).first model ||= Product.create(:name => name) 回答2 这是Rails中的完整设置,仅供我参考。 如果它也对您有帮助,我感到很高兴。 查询: Product.where("lower(name) = ?", name.downcase).first 验证者: validates :name, presence: true, uniqueness: {case_sensitive
  • 如何在Postgres 8.2中禁用参照完整性?(How do I disable referential integrity in Postgres 8.2?)
    问题 Google在这方面的结果有点薄,但是建议这不太容易。 我的特定问题是,我需要重新编号两个相互关联的表中的ID,以使表B中具有“ table_a_id”列。 我不能先对表A进行重新编号,因为然后表B中的子级指向旧ID。 我不能先对表B重新编号,因为在创建新ID之前,它们将指向新ID。 现在重复三到四个表。 当我可以“开始事务;禁用引用完整性;整理出ID;重新启用引用完整性;提交事务”时,我真的不想摆弄个人关系。 Mysql和MSSQL都提供IIRC此功能,因此如果Postgres不提供,我会感到惊讶。 谢谢! 回答1 似乎不可能。 其他建议几乎总是指向删除约束并在完成工作后重新创建约束。 但是,似乎可以将约束DEFERRABLE ,这样直到事务结束才检查约束。 请参阅PostgreSQL文档中的CREATE TABLE(搜索“可延迟”,它在页面中间)。 回答2 您可以做两件事(这些是相辅相成的,不是替代品): 将外键约束创建为DEFERRABLE。 然后,调用“ SET CONSTRAINTS DEFERRED;”,这将导致在事务结束之前不检查外键约束。 请注意,如果您未指定任何内容,则默认设置为DEFERRABLE(讨厌)。 调用“ ALTER TABLE mytable DISABLE TRIGGER ALL;”,以防止在加载数据时执行任何触发器,然后调用“ ALTER
  • 我可以使Windows的Subversion + TortoiseSVN不区分大小写吗?(Can I make Subversion + TortoiseSVN case-insensitive for Windows?)
    问题 在过去的几个月中,我一直在使用Subversion与TortoiseSVN进行代码控制,以与服务器进行接口连接,总的来说,这种情况一直很好! 但是,有时我的FoxPro IDE将改变文件扩展名的情况下没有警告,其中“program.prg”变成了“程序。PRG”)的TortoiseSVN显然借此意味着第一个文件已被删除,成为标记为‘失踪’,而第二名称显示为“非版本”,这严重破坏了我跟踪文件更改的能力。 我知道Subversion起源于* nix的区分大小写的世界,但是,与Windows一起使用时,是否有任何方法可以控制Subversion或TortoiseSVN中的这种行为使其文件名不区分大小写? 回答1 不幸的是,Subversion区分大小写。 这是由于可以在区分大小写的文件系统(例如* nix)和不区分大小写的文件系统(例如Windows,Mac)上检出Subversion中的文件。 此预提交的钩子脚本可以帮助您避免在签入文件时出现问题。 如果它不能解决您的问题,我最好的建议是编写一个小脚本,以确保所有扩展名都是小写的,并在每次签入/签出之前运行它。 这将是一个PITA,但也许是最好的选择。 回答2 Windows确实支持区分大小写,但是您必须从Windows API在CreateFile上向其发送正确的POSIX标志! 注册表项可能需要更改(SFU /
  • 【DB笔试面试498】当DML语句中有一条数据报错时,如何让该DML语句继续执行?
    ♣ 题目 部分 在Oracle中,当DML语句中有一条数据报错时,如何让该DML语句继续执行? ♣ 答案部分 当一个DML语句运行的时候,如果遇到了错误,那么这条语句会进行回滚,就好像没有执行过。对于一个大的DML语句而言,如果个别数据错误而导致整个语句的回滚,那么会浪费很多的资源和运行时间。所以,从Oracle 10g开始Oracle支持记录DML语句的错误,而允许语句自动继续执行。这个功能可以使用DBMS_ERRLOG包实现。 1LHR@orclasm > CREATE TABLE T1 AS SELECT ROWNUM A,ROWNUM B FROM DBA_SEGMENTS WHERE ROWNUM <=10; 2 3Table created. 4 5LHR@orclasm > CREATE TABLE T2 AS SELECT ROWNUM A,ROWNUM B FROM DBA_SEGMENTS WHERE ROWNUM <=20; 6 7Table created. 8 9LHR@orclasm > ALTER TABLE T1 ADD CONSTRAINT PK_T1_A PRIMARY KEY(A);1011Table altered.1213LHR@orclasm > INSERT INTO T1 SELECT * FROM T2;14 INSERT INTO
  • MySQL数据库-笔记02【创建数据库与数据表、数据类型、约束概念与举例】
    学习地址:一天学会 MySQL 数据库 MySQL安装教程 MySQL专栏 🚀01-03:MySQL数据库-笔记01【数据库概念、数据库安装、终端操作数据库】🚀04-15:MySQL数据库-笔记02【创建数据库与数据表、数据类型、约束概念与举例】🚀16-21:MySQL数据库-笔记03【范式(1NF、2NF、3NF)、查询练习题*10道(附解析)】🚀22-29:MySQL数据库-笔记04【查询练习题*8道(附解析)】🚀30-54:MySQL数据库-笔记05【查询练习题*25道(附解析)】🚀55-64:MySQL数据库-笔记06【SQL的4种连接查询、事务】 目 录 04-如何创建 数据库、数据表? 0、MySQL注释的3种写法(-- ...、#...、/*...*/) 1、如何在数据库服务器中创建自己的数据库? (create database 数据库名;) 2、选中某一数据库(use 数据库名;) 3、查看数据库中的所有数据表(show tables;) 4、如何创建一个数据表?(create TABLE xxx...) 5、查看数据表是否创建成功?(show tables;) 6、查看创建好的数据表的结构(describe 数据表名;) 05-INSERT增加数据记录 1、查看数据表中的记录(select * from 数据表名;) 2、往数据表中添加数据记录(insert
  • Mysql黑框操作——基本命令语句
    刚学数据库操作,为了更能感受代码的魅力,走入代码环境,最好用黑框操作。 1.通过cmd连接到自己的数据库 mysql -u用户名 -h 地址 -p 如图所示:这里127.0.0.1是本机IP 等于localhost 回车之后会输入密码; 用户名一般都是root 密码是安装的时候设置的 也可以通过这个语句连接别人数据库(前提,在同一局域网下,还需知道他的IP和密码,!!还需注意对方的数据库要开始访问权限) 这里补充一下关于对数据库权限的大概了解 数据库默认是不允许其他IP访问的,可以配置登录权限,是否允许远程访问 关于数据库的权限: 1.可以设置只对哪些实例有权限,哪些实例没有权限。 2.对哪些表有权限,哪些没有。 3.可以设置成有哪类权限(例如:只读)。 4.可以设置哪些IP可以访问,哪些不能。 Mysql默认端口:3306(一般正式服务器都会修改端口,因为默认端口容易受到攻击) 对于数据库权限和端口的了解到时候再整理一篇博客,目前先知道这些。 基本命令语句 (不用特意区分大小写!) (注意分号哦!) 查看数据库: show databases; 创建数据库: create database 数据库名; 使用数据库: use 数据库名; 删除数据库: drop database 数据库名; 创建表 create table 表名( 列名1 类型(长度) [约束], …… )
  • MySQL索引原理
    目录一、初识索引1.1 为什么要有索引?1.2 什么是索引?1.3 你是否对索引存在误解?二、索引的原理2.1 索引原理2.2 磁盘IO与预读三、索引的数据结构四、MySQL索引管理4.1 功能4.2 MySQL常用的索引4.3 各个索引应用场景4.4 索引的两大类型hash与btree4.5 创建/删除索引的语法4.6 示例五、测试索引5.1 数据准备5.2 小结六、正确使用索引6.1 索引未命中6.2 其他注意事项七、联合索引和覆盖索引7.1 联合索引7.2 覆盖索引7.3 合并索引八、查询优化神器-explain九、慢查询优化的基本步骤十、慢日志管理一、初识索引1.1 为什么要有索引?一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。1.2 什么是索引?索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。1.3
  • PHP不区分大小写的in_array函数(PHP case-insensitive in_array function)
    问题 使用in_array函数时是否可以进行不区分大小写的比较? 因此,使用这样的源数组: $a= array( 'one', 'two', 'three', 'four' ); 以下查找将全部返回true: in_array('one', $a); in_array('two', $a); in_array('ONE', $a); in_array('fOUr', $a); 哪些功能或一组功能会做同样的事情? 我不认为in_array本身可以做到这一点。 回答1 您可以使用preg_grep(): $a= array( 'one', 'two', 'three', 'four' ); print_r( preg_grep( "/ONe/i" , $a ) ); 回答2 显而易见的事情是将搜索词转换为小写: if (in_array(strtolower($word), $array)) { ... 当然,如果数组中有大写字母,则需要先执行以下操作: $search_array = array_map('strtolower', $array); 并搜索。 每次搜索都对整个数组执行strtolower毫无意义。 但是搜索数组是线性的。 如果你有一个大的数组或你打算这样做了很多,这将是更好地把搜索条件在阵列的关键,因为这将是更快的访问: $search_array = array
  • 主键与唯一约束?(Primary Key versus Unique Constraint?)
    问题 我目前正在设计一个全新的数据库。 在学校里,我们总是学会在每张桌子上放一个主键。 我读了很多文章/讨论/新闻组的帖子,说最好使用唯一性约束(某些数据库又名唯一索引)代替PK。 您的观点是什么? 回答1 您可以提供对这些文章的引用吗? 我认为没有理由更改已尝试和真实的方法。 毕竟,主键是关系数据库的基本设计功能。 使用UNIQUE达到相同的目的听起来对我来说实在是小菜一碟。 他们的理由是什么? 编辑:我的注意力刚刚回到了这个旧答案。 也许您阅读的有关PK与UNIQUE的讨论涉及的是人们将某件事称为PK,其唯一目的是在其上增强唯一性。 答案是,如果它是密钥,则使其成为密钥,否则使其成为唯一。 回答2 主键实际上只是不允许NULL的候选键。 因此,用SQL术语来说-与其他唯一键没有什么不同。 但是,对于我们非理论性的RDBMS,您应该有一个主键-我从未听说过它另有说法。 如果该主键是代理键,那么您还应该对自然键有唯一的约束。 重要的一点是,您应该对所有候选键(无论是自然键还是替代键)都具有唯一的约束。 然后,您应该选择一个在外键中最容易引用的键作为您的主键*。 您还应该具有聚集索引*。 这可以是您的主键,也可以是自然键-但这不是必需的。 您应该根据表的查询用法选择聚簇索引。 如有疑问,主键不是一个坏的首选。 尽管从技术上讲,仅需要在外键关系中引用唯一键,但是公认的惯例是非常喜欢主键
  • MySQL学习笔记
    SQL学习笔记 数据库概念 数据库:用于存储和管理数据的仓库 数据库特点: 持久化存储数据,其实数据库就是一个文件系统方便存储和管理数据使用了统一的方式操作数据库 SQL SQL: Structured Query Language:结构化查询语言 SQL通用语法: SQL 语句可以单行或多行书写,以分号结尾。可使用空格和缩进来增强语句的可读性。MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。3 种注释 单行注释: – 注释内容 或 # 注释内容(mysql 特有)多行注释: /* 注释 */ SQL分类: DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等DML(Data Manipulation Language)数据操作语言 用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等DQL(Data Query Language)数据查询语言 用来查询数据库中表的记录(数据)。关键字:select, where 等DCL(Data Control Language)数据控制语言(了解) 用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等 DDL:操作数据库、表 操作数据库:CRUD
  • Linux系统下SQL Server数据库操作
    Linux系统SQL Server数据库操作命令 连接数据库 sqlcmd命令创建数据库:查看所有数据库:创建表添加主键约束外部关键字怎么添加唯一约束怎么添加非空约束怎么使用默认约束设置表的属性值自动增加 连接数据库 sqlcmd命令 SQLServer 提供了 sqlcmd 命令,来让我们操作 SQLServer 数据库。接下来我们连接它,并在其中创建一个名为 TestDb 的数据库。 连接 SQLServer :sqlcmd -S localhost -U sa -P '<123123Aa!@>' 如果连接失败原因是服务还未开启,等待几秒重试即可,上述语句各参数解释如下: sqlcmd 是连接数据库必要的语句, localhost 代表从本地连接,sa 是用户名, ‘<123123Aa!@>’ 是密码。 创建数据库: create database TestDb。 查看所有数据库: select name from sys.databases。 操作完毕之后退出: exit 。 创建表 我们先来了解一下,在数据库中创建表的规则: CREATE TABLE 表名 ( 字段名,数据类型, 字段名,数据类型, ..... ) 例如: 添加了数据的表格,示例如下: 首先,创建数据库(在 SQLServer 数据库中是不区分大小写的,不过数据库的名字是区分大小写的),如下: CREATE
  • sql语句错误:“列..不存在”(sql statement error: “column .. does not exist”)
    问题 我试图从postgres控制台此命令: select sim.id as idsim, num.id as idnum from main_sim sim left join main_number num on (FK_Numbers_id=num.id); 我得到了这个回应: ERROR: column "fk_numbers_id" does not exist LINE 1: ...m from main_sim sim left join main_number num on (FK_Numbers... 但是如果我只是用以下方法检查我的桌子: dbMobile=# \d main_sim id | integer | not null default Iccid | character varying(19) | not null ... FK_Device_id | integer | FK_Numbers_id | integer | Indexes: "main_sim_pkey" PRIMARY KEY, btree (id) "main_sim_FK_Numbers_id_key" UNIQUE, btree ("FK_Numbers_id") "main_sim_Iccid_key" UNIQUE, btree ("Iccid") "main_sim
  • DBMS_ERRLOG记录DML错误日志
    Table 64-2 CREATE_ERROR_LOG Procedure ParametersParameterDescriptiondml_table_nameThe name of the DML table to base the error logging table on. The name can be fully qualified (for example, emp, scott.emp, "EMP", "SCOTT"."EMP"). If a name component is enclosed in double quotes, it will not be upper cased.err_log_table_nameThe name of the error logging table you will create.The default is the first 25 characters in the name of the DML table prefixed with 'ERR$_'. Examples are the following:dml_table_name: 'EMP', err_log_table_name: 'ERR$_EMP'dml_table_name: '"Emp2"', err_log_table_name: 'ERR$
  • 使用电子邮件地址作为主键?(Use email address as primary key?)
    问题 与自动递增的数字相比,电子邮件地址是否是主要的候选地址? 我们的Web应用程序需要电子邮件地址在系统中唯一。 因此,我想到了使用电子邮件地址作为主键。 但是我的同事建议,字符串比较将比整数比较慢。 不使用电子邮件作为主键是正确的理由吗? 我们正在使用PostgreSQL 。 回答1 字符串比较比int比较慢。 但是,如果您只是使用电子邮件地址从数据库中检索用户,这并不重要。 如果您有包含多个联接的复杂查询,这很重要。 如果您在多个表中存储有关用户的信息,则用户表的外键将是电子邮件地址。 这意味着您多次存储了电子邮件地址。 回答2 我还要指出,电子邮件是创建唯一字段的错误选择,有些人甚至是小型企业都共享一个电子邮件地址。 就像电话号码一样,电子邮件也可以重复使用。 一年后,Jsmith @ somecompany.com可以轻松属于John Smith,两年后可以轻松属于Julia Smith。 电子邮件的另一个问题是它们经常更改。 如果您要使用其他键加入其他表,那么您还必须更新其他表,这在整个客户公司更改其电子邮件时都会对性能造成很大的影响(我见过这种情况)。 回答3 主键应该是唯一且恒定的 电子邮件地址会随着季节的变化而变化。 用作查找的辅助键,但为主键的选择不理想。 回答4 使用电子邮件地址作为主键的缺点: 加入时变慢。 现在,任何其他带有已发布外键的记录都将具有更大的值
  • 在MySQL中,我可以将参照完整性检查推迟到提交之前(In MySQL, can I defer referential integrity checks until commit)
    问题 就像这个问题一样,我一直在阅读PoEAA,想知道是否有可能将参照完整性检查推迟到在MySQL中提交之前。 想要在同一提交中插入一堆产品和相关产品时遇到了这个问题。 即使在事务中,当我尝试插入related_products连接表时,也会遇到约束错误。 如果有帮助,我正在使用PHP PDO进行数据库连接。 我会很感激您能提供的任何帮助。 回答1 看来我的答案在这里... 通常,与MySQL一样,在插入,删除或更新许多行的SQL语句中,InnoDB逐行检查UNIQUE和FOREIGN KEY约束。 当执行外键检查时,InnoDB在必须查看的子记录或父记录上设置共享的行级锁。 InnoDB立即检查外键约束; 该检查不会推迟到事务提交。 根据SQL标准,默认行为应推迟检查。 也就是说,仅在处理了整个SQL语句之后才检查约束。 在InnoDB实现延迟约束检查之前,某些事情将是不可能的,例如使用外键删除引用其自身的记录。 回到绘图板。 回答2 如果您要询问MySQL是否支持外键的DEFERRABLE属性(包括选项INITIALLY DEFERRED ),那么答案是肯定的。 您不能将约束检查推迟到MySQL中的提交时间。 而且-正如您已经指出的-总是在“行级别”而不是“语句级别”对它们进行评估。 回答3 您可以通过设置服务器变量来临时禁用外键检查,从而解决innodb引擎的这一局限性:
  • 最强MySQL笔记(超详细版)(一)
    第一章 数据库概述 1.1 数据库概述 DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。 DB:数据库(Database) SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。 如果把数据库比作盘子,那数据就是盘子里的菜,SQL则是你的筷子。 数据库类型:数据库经过几十年的发展,出现了多种类型。目前最常见的数据库模型主要是:关系型数据库和(noSQL)非关系型数据库。 MySQL:其中的一款关系型数据库管理系统 关系型数据库模型是将复杂的数据结构用较为简单的二元关系(二维表)来表示,如图所示。在该类型数据库中,对数据的操作基本上都建立在一个或多个表格上,我们可以采用结构化查询语言(SQL)对数据库进行操作。关系型数据库是目前主流的数据库技术,其中具有代表性的数据库管理系统有:Oracle、DB2、SQL Server、MySQL等。 非关系型数据库: 随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS( 社交网络服务 )类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展