2017-04-18 40 views
0

我有一个临时表和一个datawarehouse表,它不断给我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); 
+0

在Oracle中CREATE OR REPLACE TABLE语法? – user75ponic

+0

抱歉,我选择了错误的。这是Exasol,与ORacle 95%相似 –

+0

这5%可能是至关重要的。但是,您已经显示了登台表PK而不是目标表 - 那么哪个列形成该表上的PK? –

回答

1

The EXASolution user manual说:

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

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

你不应该约束误标识列,即标识列不保证唯一的值。但只要值只是隐式插入并且不会手动更改,值就是唯一的。

您已经在您的标识列上放置了主键约束,因此它必须是唯一的。既然你从合并中获得重复,你可以(a)在某些时候提供了如上面第一个项目符号中的显式值或手动更新了一个值,并且单调增加的顺序已经达到了与那些值冲突的点现有价值;或者(b)merge中存在错误。前者似乎更可能。

您可以查看最近插入的值(如果有),或者对新行进行临时插入(使用合并)以查看它是否会成功创建行,如果是,您是否已经具有高于它为这个新行分配的那个。如果已经没有更高的值,并且插入作品和合并继续失败一致,那么这听起来像是你需要用EXASolution提出的东西。