2015-05-09 41 views
0

由於FK引用,我在INSERT上遇到問題。過程是這樣的:虛擬表上的INSERT衝突SQL

  1. 我創建表Cuentas,並Cuentas_Con_RowNumber
  2. 我從一個巨大的表中有超過300萬條記錄中進行選擇。因爲有些重複,我只需要存儲1個「cuenta」,我做了tempDB。我必須這樣做,因爲在龐大的數據庫中有很多記錄,具有相同的Cuenta_Nro不同的交易,我只需要一個。
  3. 我從tempDB中選擇除RowNumber之外的所有列,然後將其插入Cuentas表中。
  4. 問題是tempDBPais(國家)列不是參考Paises(國家)表的FK,而在原始表(Cuentas)上,因此它崩潰。

代碼:

CREATE TABLE Paises 
(
    Pais_Id numeric(18,0) PRIMARY KEY NOT NULL, 
    Pais_Nombre varchar(255) NOT NULL 
) 

CREATE TABLE Cuentas 
(
    Cuenta_Nro numeric(18,0) PRIMARY KEY NOT NULL, 
    Cuenta_Estado varchar(255), 
    Cuenta_Moneda varchar(255) DEFAULT 'Dolar', 
    Cuenta_Tipo numeric(18,0) 
     FOREIGN KEY REFERENCES Tipo_De_Cuentas(Tipo_De_Cuenta_Id), 
    Cuenta_PaisOrigen numeric(18, 0) 
     FOREIGN KEY REFERENCES Paises(Pais_Id), 
    Cuenta_PaisAsignado numeric(18, 0) 
     FOREIGN KEY REFERENCES Paises(Pais_Id), 
    Cuenta_Fec_Cre datetime, 
    Cuenta_Fec_Cierre datetime, 
    Cuenta_Tarjeta numeric(18, 0) 
     FOREIGN KEY REFERENCES Tarjetas(Tarjeta_Nro), 
    Cuenta_Cliente numeric(18, 0) 
     FOREIGN KEY REFERENCES Clientes(Cliente_Id) 
) 

CREATE TABLE #Cuentas_Con_RowNumer 
(
    Cuenta_Nro numeric(18,0) PRIMARY KEY NOT NULL, 
    Cuenta_Estado varchar(255), 
    Cuenta_PaisOrigen numeric(18,0)), 
    Cuenta_Fec_Cre datetime, 
    Cuenta_Fec_Cierre datetime, 
    Cuenta_Cliente numeric(18,0), 
    Cuenta_Tarjeta numeric(18,0), 
    RowNumber int 
) 

INSERT INTO #Cuentas_Con_RowNumer 
    SELECT * 
    FROM (SELECT 
      Maestro.Cuenta_Numero, Maestro.Cuenta_Estado, Maestro.Cuenta_Pais_Codigo, 
      Maestro.Cuenta_Fecha_Creacion, Maestro.Cuenta_Fecha_Cierre, Clientes.Cliente_Id, Maestro.Tarjeta_Numero, 
      ROW_NUMBER() OVER (PARTITION BY Maestro.Cuenta_Numero ORDER BY Maestro.Cuenta_Numero) AS RowNumber 
     FROM gd_esquema.Maestra Maestro, dbo.Clientes 
     WHERE 
     Clientes.Cliente_Apellido = Maestro.Cli_Apellido AND 
     Clientes.Cliente_Nombre = Maestro.Cli_Nombre) AS a 
    WHERE a.RowNumber = '1' 


INSERT INTO Cuentas 
    (
     Cuenta_Nro, Cuenta_Estado, Cuenta_PaisOrigen, Cuenta_Fec_Cre, 
     Cuenta_Fec_Cierre, Cuenta_Cliente, Cuenta_Tarjeta 
    ) 
    SELECT 
     Cuenta_Nro, Cuenta_Estado, Cuenta_PaisOrigen, Cuenta_Fec_Cre, 
     Cuenta_Fec_Cierre, Cuenta_Cliente, Cuenta_Tarjeta 
    FROM #Cuentas_Con_RowNumer 

的錯誤信息是:

InstrucciónINSERT連接conflicto CON LArestricción主鍵 「FK__Cuentas__Cuenta___24B338F0」。 El與基礎數據衝突「GD1C2015」,tabla「dbo.Paises」,列「Pais_Id」。

回答

0

的問題是,因爲Maestro.Cuenta_Pais_Codigo列正在從gd_esquema.Maestra表該消息又在目標表將作爲Cuenta_PaisOrigen並具有已定義的外鍵拉。

將會有一些記錄正在被選中插入Cuentas表中,該表在dbo.Paises表中沒有匹配的Pais_Id記錄。

您可以添加內部如下加入,檢查結果爲:

INSERT INTO #Cuentas_Con_RowNumer 
    SELECT * 
    FROM (SELECT 
      ... 
     FROM gd_esquema.Maestra Maestro 
     inner join dbo.Clientes on  
     Clientes.Cliente_Apellido = Maestro.Cli_Apellido AND 
     Clientes.Cliente_Nombre = Maestro.Cli_Nombre 
     inner join Paises P on Maestro.Cuenta_Pais_Codigo = P.Pais_Id 
     ) AS a 
    WHERE a.RowNumber = '1'