【问题标题】:INSERT Conflict on Virtual Table SQL虚拟表 SQL 上的 INSERT 冲突
【发布时间】:2015-05-09 15:45:58
【问题描述】:

由于 FK 引用,我在 INSERT 上遇到问题。流程如下:

  1. 我创建了表CuentasCuentas_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ón INSERT en conflicto con la restrictción FOREIGN KEY "FK__Cuentas__Cuenta___24B338F0"。 El conflicto ha aparecido en la base de datos "GD1C2015", tabla "dbo.Paises", column 'Pais_Id'。

【问题讨论】:

    标签: sql sql-server-2008 insert


    【解决方案1】:

    问题是因为Maestro.Cuenta_Pais_Codigo 列是从gd_esquema.Maestra 表中提取的,而Cuenta_PaisOrigen 又在目标表中作为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'
    

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 2018-02-08
      • 1970-01-01
      • 2010-10-22
      • 2018-04-29
      • 1970-01-01
      • 2012-11-06
      • 2014-08-17
      相关资源
      最近更新 更多