es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Código de error SQL: 4025. RESTRICCIÓN (intentando agregar una restricción para verificar el código postal).

Soy algo nuevo en bases de datos y SQL, así que esperaba obtener algo de ayuda con mi problema. Estoy tratando de agregar una validación para los códigos postales neerlandeses en una tabla existente llamada “order”. La columna que deseo verificar se llama “Zip” varchar(7). Utilicé la siguiente consulta que sigue dándome un error 4025:

ALTER TABLE `order`
ADD CONSTRAINT CK_zip
CHECK (Zip LIKE '#### ##');

También estaba intentando crear un disparador para el mismo campo de entrada, pero tampoco funcionaba. El disparador que estaba tratando de agregar:

DELIMITER // 
CREATE TRIGGER valid_zip
    BEFORE INSERT ON `order`
    FOR EACH ROW 
       BEGIN 
         IF NEW.Zip NOT LIKE '#### ##' THEN 
          SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Código postal no válido'; 
         END IF; 
       END; 
 // 
DELIMITER ;

Claramente estoy haciendo algo mal, pero no puedo averiguar qué. Quiero agregar una validación en un campo de entrada que coincida con el formato del código postal neerlandés (0000 XX). Por lo tanto, “1234 AA” y “2897 BC” pueden pasar, pero “44444 A” o “4444AA” no pueden. ¡Gracias!

Motor: InnoDB

Programa: MySQLWorkbench 8.0

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, es posible que desees cambiar el nombre de tu tabla de order a otra cosa, ya que es una palabra clave reservada en SQL. Puedes utilizar algo como customer_order en su lugar.

    A continuación, para la consulta de ALTER TABLE, el problema podría estar en el operador LIKE. En lugar de usar LIKE, intenta usar REGEXP de esta forma:

    ALTER TABLE customer_order
    ADD CONSTRAINT CK_zip
    CHECK (Zip REGEXP '^[1-9][0-9]{3}\s?[a-zA-Z]{2}$');
    

    Esto validará que el campo Zip coincida con el formato del código postal holandés (XXXX AA o XXXXAA).

    Para el trigger, el problema podría estar en la declaración IF. En lugar de usar NOT LIKE, intenta usar NOT REGEXP de esta forma:

    DELIMITER // 
    CREATE TRIGGER valid_zip
        BEFORE INSERT ON customer_order
        FOR EACH ROW 
           BEGIN 
             IF NEW.Zip NOT REGEXP '^[1-9][0-9]{3}\s?[a-zA-Z]{2}$' THEN 
              SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No es un código postal válido'; 
             END IF; 
           END; 
     // 
    DELIMITER ;
    

    Espero que esto ayude. Hazme saber si tienes alguna otra pregunta.

Comments are closed.