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

Oracle DB和PostgreSQL,OpenGauss主外键一致性的区别

针对于unique索引在主外键上的表现,o和PG的行为确实不一致,测试样例:

PG:

测试1:

test=#  CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL,  globalid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  type SMALLINT NOT NULL,  name VARCHAR(255) NOT NULL,  defaulttool VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  datasetguid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  subtype INTEGER NULL,   description VARCHAR(1024) NULL,   tags VARCHAR(2000) NULL,  visible SMALLINT NOT NULL,  hash VARCHAR(64) NOT NULL,  useridentity VARCHAR(255) NULL,  status INTEGER NULL);
CREATE TABLECREATE UNIQUE INDEX EdTemplates_Globalid_idx ON gdb_editingtemplates (globalid );
CREATE INDEXCREATE TABLE gdb_editingtemplaterelationships ( objectid INTEGER NOT NULL,  type SMALLINT NOT NULL,  originid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  destid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL);
CREATE TABLE
test=# ALTER TABLE GDB_EditingTemplateRelationships ADD CONSTRAINT EdTemplateRlships_OriginID_fk FOREIGN KEY (originid) REFERENCES GDB_EditingTemplates (globalid);
ALTER TABLE
test=# select version();version
---------------------------------------------------------------------------------------------------------PostgreSQL 11.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 行记录)
test=# drop table gdb_editingtemplaterelationships;
DROP TABLE
test=# drop table gdb_editingtemplates;
DROP TABLE
test=#  CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL,  globalid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  type SMALLINT NOT NULL,  name VARCHAR(255) NOT NULL,  defaulttool VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  datasetguid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  subtype INTEGER NULL,   description VARCHAR(1024) NULL,   tags VARCHAR(2000) NULL,  visible SMALLINT NOT NULL,  hash VARCHAR(64) NOT NULL,  useridentity VARCHAR(255) NULL,  status INTEGER NULL);
CREATE TABLE
test=# alter table gdb_editingtemplates add constraint gdb_editingtemplates_global_uniq unique(globalid);
ALTER TABLE
test=# CREATE TABLE gdb_editingtemplaterelationships ( objectid INTEGER NOT NULL,  type SMALLINT NOT NULL,  originid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  destid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL);
CREATE TABLE
test=# ALTER TABLE GDB_EditingTemplateRelationships ADD CONSTRAINT EdTemplateRlships_OriginID_fk FOREIGN KEY (originid) REFERENCES GDB_EditingTemplates (globalid);
ALTER TABLE
test=# select version();version
---------------------------------------------------------------------------------------------------------PostgreSQL 11.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 行记录)

华为GaussDB for openGauss:

test_temp=> select version();
-[ RECORD 1 ]--------------------------------------------------------------------------------------------------------------
version | gaussdb (GaussDB Kernel 503.1.0 build f53b4ed8) compiled at 2023-03-27 00:43:20 commit 5356 last mr 10743 releasetest_temp=> select * from pg_database where datname=current_database();
-[ RECORD 1 ]----+----------
datname          | test_temp
datdba           | 18389
encoding         | 0
datcollate       | C
datctype         | C
datistemplate    | f
datallowconn     | t
datconnlimit     | -1
datlastsysoid    | 12810
datfrozenxid     | 0
dattablespace    | 1663
datcompatibility | A
datacl           |
datfrozenxid64   | 14613
datminmxid       | 2
dattimezone      | PRCtest_temp=>  CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL,  globalid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  type SMALLINT NOT NULL,  name VARCHAR(255) NOT NULL,  defaulttool VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  datasetguid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  subtype INTEGER NULL,   description VARCHAR(1024) NULL,   tags VARCHAR(2000) NULL,  visible SMALLINT NOT NULL,  hash VARCHAR(64) NOT NULL,  useridentity VARCHAR(255) NULL,  status INTEGER NULL);
CREATE TABLE
test_temp=>
test_temp=> CREATE UNIQUE INDEX EdTemplates_Globalid_idx ON gdb_editingtemplates (globalid );
CREATE INDEX
test_temp=> CREATE TABLE gdb_editingtemplaterelationships ( objectid INTEGER NOT NULL,  type SMALLINT NOT NULL,  originid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  destid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL);
CREATE TABLE
test_temp=> ALTER TABLE GDB_EditingTemplateRelationships ADD CONSTRAINT EdTemplateRlships_OriginID_fk FOREIGN KEY (originid) REFERENCES GDB_EditingTemplates (globalid);
ALTER TABLE
test_temp=> drop table gdb_editingtemplaterelationships;
DROP TABLE
test_temp=> drop table gdb_editingtemplates;
DROP TABLE
test_temp=>  CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL,  globalid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  type SMALLINT NOT NULL,  name VARCHAR(255) NOT NULL,  defaulttool VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  datasetguid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  subtype INTEGER NULL,   description VARCHAR(1024) NULL,   tags VARCHAR(2000) NULL,  visible SMALLINT NOT NULL,  hash VARCHAR(64) NOT NULL,  useridentity VARCHAR(255) NULL,  status INTEGER NULL);
CREATE TABLE
test_temp=> alter table gdb_editingtemplates add constraint gdb_editingtemplates_global_uniq unique(globalid);
NOTICE:  ALTER TABLE / ADD UNIQUE will create implicit index "gdb_editingtemplates_global_uniq" for table "gdb_editingtemplates"
ALTER TABLE
test_temp=> CREATE TABLE gdb_editingtemplaterelationships ( objectid INTEGER NOT NULL,  type SMALLINT NOT NULL,  originid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  destid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL);
CREATE TABLE
test_temp=> ALTER TABLE GDB_EditingTemplateRelationships ADD CONSTRAINT EdTemplateRlships_OriginID_fk FOREIGN KEY (originid) REFERENCES GDB_EditingTemplates (globalid);
ALTER TABLE

PG和华为 gaussDB for openGauss(兼容o模式)  ,在主表的关联键上建unique索引或者unique的constraint都可以。

O:

SQL>  CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL,  globalid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  type SMALLINT NOT NULL,  name VARCHAR(255) NOT NULL,  defaulttool VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  datasetguid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NULL,  subtype INTEGER NULL,   description VARCHAR(1024) NULL,   tags VARCHAR(2000) NULL,  visible SMALLINT NOT NULL,  hash VARCHAR(64) NOT NULL,  useridentity VARCHAR(255) NULL,  status INTEGER NULL);Table created.SQL> CREATE UNIQUE INDEX EdTemplates_Globalid_idx ON gdb_editingtemplates (globalid );Index created.SQL> CREATE TABLE gdb_editingtemplaterelationships ( objectid INTEGER NOT NULL,  type SMALLINT NOT NULL,  originid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL,  destid VARCHAR(38) DEFAULT '{00000000-0000-0000-0000-000000000000}' NOT NULL);Table created.SQL> ALTER TABLE GDB_EditingTemplateRelationships ADD CONSTRAINT EdTemplateRlships_OriginID_fk FOREIGN KEY (originid) REFERENCES GDB_EditingTemplates (globalid);
ALTER TABLE GDB_EditingTemplateRelationships ADD CONSTRAINT EdTemplateRlships_OriginID_fk FOREIGN KEY (originid) REFERENCES GDB_EditingTemplates (globalid)*
ERROR at line 1:
ORA-02270: no matching unique or primary key for this column-listSQL> alter table gdb_editingtemplates add constraint gdb_editingtemplates_gid_unique unique(globalid);Table altered.SQL> ALTER TABLE GDB_EditingTemplateRelationships ADD CONSTRAINT EdTemplateRlships_OriginID_fk FOREIGN KEY (originid) REFERENCES GDB_EditingTemplates (globalid);Table altered.

在主表上的关联键上建unique索引,在建关联的时候会报错,需要建一个unique的constraint才可以,也就是说o上不认unique索引,只认constraint。

个人认为,PG的兼容性更好些。

有些国产数据厂商的兼容O模式,为了兼容Oracle,也会是这样的行为。

http://www.dtcms.com/a/266503.html

相关文章:

  • 强化学习 (10)蒙特卡洛
  • SRE - - PV、UV、VV、IP详解及区别
  • Web基础关键_008_JavaScript 的 BOM、ES6、构造函数、原型
  • 利用 AI 打造的开发者工具集合
  • 【Unity笔记02】订阅事件-自动开门
  • 模型部署与推理--利用libtorch模型部署与推理
  • Redisearch接入SpringBoot项目使用
  • MySQL 中 -> 和 ->> 操作符的区别
  • github上部署自己的静态项目
  • 【狂飙AGI】第7课:AGI-行业大模型(系列1)
  • jsonCPP 开源库详解
  • CentOS配置网络
  • RocketMQ延迟消息是如何实现的?
  • 深度学习基础1
  • 基于Android的财务记账App
  • 【wps】 excel 删除重复项
  • AI 应用于进攻性安全
  • linux_git的使用
  • MySQL 8.0:窗口函数
  • 【Unity开发】Unity实现对模型移动、缩放、旋转操作的功能
  • 基于Docker构建OrangePi5 SDK环境
  • 408第三季part2 - 计算机网络 - 计算机网络基本概念
  • 闲庭信步使用SV搭建图像测试平台:第二十九课——绘制正弦波的图片
  • Android 实现底部弹窗
  • Datasophon的Ranger安装时数据库踩坑及问题解决
  • NeighborGeo:基于邻居的IP地理定位(三)
  • NeighborGeo:基于邻居的IP地理定位(二)
  • 【WEB】Polar靶场 6-10题 详细笔记
  • Jenkins-Email Extension 插件插件
  • 前端开发-前置知识