none
Validar campo antes de insertar en tabla RRS feed

  • Pregunta

  • Hola buen dia, estoy usando el tipico query para insertar los datos, pero quiero validar que el dato que voy a ingresar en el campo tipo existe en otra tabla llamada Tipos y que si no existe me mande un mensaje algomo como esto If exists(select Idtipo from Tipos where Idtipo=tipo)

    ¿Como puedo validar en la consulta que el valor que voy a insertar en la tabla Embarques existe en la tabla Tipos ?

    INSERT INTO Embarques(num_embarque,fecha,descripcion,tipo)
    VALUES (50,'2020-07-28 12:00:00','',3)





    lunes, 10 de agosto de 2020 19:17

Todas las respuestas

  • Pues creo que la solución es  muy simple, busca en Tipos si existe ese valor antes de insertar, ademas, supongo, que tienes declaradas FK y PK para tus tablas, ¿cierto?

    IIslas Master Consultant SQL Server

    martes, 11 de agosto de 2020 3:32
  • Hola AlexP5:

    La solución correcta y más fácil es aplicar una clave foránea en tu tabla de embarques que apunte a tu tabla de tipos.

    create table embarques (num_embarque int primary key, fecha datetime, descripcion varchar(100), tipo int)
    create table tipos (id_tipo int primary key, descripcion varchar(100));
    go

    -- Crear una foreign key

    Alter table embarques 
    add constraint fk_embarques_tipos foreign key (tipo) references tipos (id_tipo);
    go

    La columna tipo de la tabla embarques, hace referencia a la columna id_tipo de la tabla tipos. Si no existe el tipo no puedes insertar.

    set dateformat mdy;
    INSERT INTO Embarques(num_embarque,fecha,descripcion,tipo)
    VALUES (50,'2020-07-28 12:00:00','',3)

    Mens. 547, Nivel 16, Estado 0, Línea 9
    Instrucción INSERT en conflicto con la restricción FOREIGN KEY 'fk_embarques_tipos'. El conflicto ha aparecido en la base de datos 'xxx', tabla 'dbo.tipos', column 'id_tipo'.
    Se terminó la instrucción.

    insert into tipos (id_tipo, descripcion) 
    values (3,'test');
    
    set dateformat mdy;
    INSERT INTO Embarques(num_embarque,fecha,descripcion,tipo)
    VALUES (50,'2020-07-28 12:00:00','',3);

    Ahora ya ha sido válido.

    Solución 2

    set dateformat mdy;
    INSERT INTO Embarques(num_embarque,fecha,descripcion,tipo)
    select 
    *
    from (values (50,'2020-07-28 12:00:00','',3))T(numEmbarque, fecha, descripcion, tipo)
    where exists 
    (select * from tipos t1
    where t1.id_tipo = t.tipo
    )

    (0 filas afectadas)

    Realizar la insert contra una select.

    La select la puedes alimentar desde una TVC como en el ejemplo y luego utilizar el operador exists.

    insert into tipos (id_tipo, descripcion) 
    values (3,'test');
    
    set dateformat mdy;
    INSERT INTO Embarques(num_embarque,fecha,descripcion,tipo)
    select 
    *
    from (values (50,'2020-07-28 12:00:00','',3))T(numEmbarque, fecha, descripcion, tipo)
    where exists 
    (select * from tipos t1
    where t1.id_tipo = t.tipo
    )

    (1 fila afectada)

    (1 fila afectada)

    Exists

    https://javifer2.wordpress.com/2020/06/17/exists-como-se-implementa/

    TVC (Arrays en SQL)

    https://javifer2.wordpress.com/2020/04/05/arrays-en-sql-server-constructor-con-valores-de-tabla/

    martes, 11 de agosto de 2020 4:26