0

我有一个临时表和一个数据仓库表,它们不断给我constraint violation. 我似乎无法弄清楚为什么因为这些组合应该是独一无二的DRIVERIDRACEID我怎么得到contraint violation - primary key

桌子

CREATE TABLE QUALIFYING (
QUALIFYID      DECIMAL(18,0) IDENTITY NOT NULL,
RACEID         DECIMAL(18,0) DEFAULT '0' NOT NULL,
DRIVERID       DECIMAL(18,0) DEFAULT '0' NOT NULL,
CONSTRUCTORID  DECIMAL(18,0) DEFAULT '0' NOT NULL,
DRIVERNUMBER   DECIMAL(18,0) DEFAULT '0' NOT NULL,
DRIVERPOSITION DECIMAL(18,0) DEFAULT NULL,
Q1             VARCHAR(255) UTF8 DEFAULT NULL,
Q2             VARCHAR(255) UTF8 DEFAULT NULL,
Q3             VARCHAR(255) UTF8 DEFAULT NULL,
PRIMARY KEY(QUALIFYID)
);

分期

CREATE OR REPLACE TABLE STGQUALIFYING(
      raceId int DEFAULT '0' NOT NULL,
      driverId int DEFAULT '0' NOT NULL,
      constructorId int DEFAULT '0' NOT NULL,
      driverNumber int DEFAULT '0' NOT NULL,
      driverPosition int DEFAULT NULL,
      q1 varchar(255) DEFAULT NULL,
      q2 varchar(255) DEFAULT NULL,
      q3 varchar(255) DEFAULT NULL,
      PRIMARY KEY(RACEID, DRIVERID)
);

SQL

MERGE INTO QUALIFYING c
USING STGQUALIFYING n
ON
(n.RACEID = c.RACEID AND n.DRIVERID = c.DRIVERID)
WHEN MATCHED THEN
    UPDATE SET
    CONSTRUCTORID = n.CONSTRUCTORID, DRIVERNUMBER = n.DRIVERNUMBER, DRIVERPOSITION = n.DRIVERPOSITION, Q1 = n.Q1, Q2 = n.Q2, Q3 = n.Q3
WHEN NOT MATCHED THEN
    INSERT (RACEID, DRIVERID, CONSTRUCTORID, DRIVERNUMBER, DRIVERPOSITION, Q1, Q2, Q3) VALUES
    (RACEID, DRIVERID, CONSTRUCTORID, DRIVERNUMBER, DRIVERPOSITION, Q1, Q2, Q3);
4

1 回答 1

1

EXASolution 用户手册说:

标识列的内容适用于以下规则:

  • 如果在插入行时为标识列指定显式值,则会插入该值。
  • 在所有其他情况下,系统会生成单调递增的数字,但数字之间可能会出现间隙。

您不应将标识列与约束混淆,即标识列不保证唯一值。但是,只要值仅隐式插入且未手动更改,这些值就是唯一的。

您已在标识列上设置了主键约束,因此它必须是唯一的。由于您从合并中获取重复项,因此(a)您在某些时候提供了上面第一个项目符号中的显式值或手动更新了一个值,并且单调递增的序列已经达到与那些冲突的点现有价值观;或 (b) 他们的merge. 前者似乎更有可能。

You can look at recently inserted value if you have one, or do a temporary insert of a new row (with merge) to see if it will create a row successfully, and if so whether you already have ID values higher than the one it allocates for that new row. If there are no higher values already, and insert works and merge continues to fail consistently, then it sounds like something you'd need to raise with EXASolution.

于 2017-04-18T19:46:47.697 回答