2015-05-09 89 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'