我正在使用 PostgreSQL 9.1.5 和psql来运行一个 scipt,其中包含各种表中的一系列INSERT语句:
psql -U usernamefoo databasenamefoo -f dml_script.sql
Run Code Online (Sandbox Code Playgroud)
表约束是使用DEFERRABLE选项创建的,脚本本身(上面的文件 dml_script.sql)在有问题的INSERT之前发出以下内容:
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO KM_TRANSACTION_GROUPS ..
Run Code Online (Sandbox Code Playgroud)
我已经检查过有关表的特定约束是否已使用DEFRRABLE选项创建:
ALTER TABLE ONLY KM_TRANSACTION_GROUPS ADD CONSTRAINT TRGR_TRGR_FK FOREIGN KEY (TRGR_PARENT_ID) REFERENCES KM_TRANSACTION_GROUPS(TRGR_ID) DEFERRABLE;
Run Code Online (Sandbox Code Playgroud)
然而,运行 DML 脚本失败:
psql:./schema-dml-test.sql:8: ERROR: insert or update on table "km_transaction_groups" violates foreign key constraint "trgr_trgr_fk"
DETAIL: Key (trgr_parent_id)=(2) is not present in table "km_transaction_groups".
Run Code Online (Sandbox Code Playgroud)
我的猜测是 psql 将dml_script.sql 中的每个INSERT行视为一个单独的事务。如果这是原因,是否有办法将 dml_script.sql 文件中的 INSERT 语句分组为一个较长的事务(或者可能将整个文件视为一个单个事务),以便在其结束时(当 …
出于测试目的,我需要以任意(但可重现)的顺序从一组数据库表中获取一些数据。这个想法是我以后可以使用文本差异工具比较两次运行。有成语吗?
例如,我显然可以做一个:
SELECT * FROM table_with_N_columns ORDER BY column_1, ... , column_N
Run Code Online (Sandbox Code Playgroud)
我只是在问是否有一种惯用的方法来实现相同的效果(为了我的目的),而不必费心在 ORDER BY 子句中列出每一列。只要可以在查询的后续运行中重现,任何排序都将执行。
这是来自我的数据库的真实结果。我花了一些时间尝试使用 SSCCE 重现此行为,但失败了。下面的最后一个结果怎么可能?
SELECT COUNT(*) FROM rr.resource a
--- 15771
SELECT COUNT(*) FROM rr.resource a
NATURAL JOIN rr.interface b
--- 41419
SELECT COUNT(*)
FROM rr.resource a
NATURAL JOIN rr.interface b
NATURAL JOIN rr.interface c
--- 0
Run Code Online (Sandbox Code Playgroud)
上次查询中的零 (0) 行计数每次都是一致且可重复的。在我创建的一些示例中,向同一个表添加第二个自然连接两次会产生相同数量的行(正如我所期望的)。那么上面的结果怎么可能呢?
PostgeSQL 有一些非常丰富的字段和行大小限制(分别为 1GB 和 1.6TB)。
另一方面,Sybase ASE 的行大小限制在 4 或 8KB 左右。
例如,在 Sybase ASE 15.7 上我看到:
sqldev.mydatabase.1> create table foo2(a VARCHAR(7000));
Warning: Row size (7034 bytes) could exceed row size limit, which is 1962 bytes
Run Code Online (Sandbox Code Playgroud)
这不仅仅是关于性能的警告,因为当我尝试插入大于 1962 字节的内容时,它实际上是强制执行的:
Attempt to update or insert row failed because resultant row of size 4462 bytes is larger than the maximum size (1962 bytes) allowed for this table.
Command has been aborted.
Run Code Online (Sandbox Code Playgroud)
我猜由于共同的传统,类似的限制适用于 SQL Server,谷歌似乎同意(但我没有在 SQL Server 上尝试过)。
我假设这种巨大的差异一定是一些截然不同的架构决策或一些基本权衡的结果,这些权衡是由每个 RDBMS 以不同方式决定的。如果这是正确的,那将是什么权衡或架构决策?