31

에서이 질문나는 NULL 값의 삽입을 막는 법을 배웠다. 하지만 불행히도 빈 문자열이 삽입됩니다. PHP 측에서 이것을 방지하는 것 외에도 데이터베이스 제약과 같은 것을 사용하여 이것을 방지하고 싶습니다. 물론 애플리케이션 측면에 대한 점검이 필요하지만 양측에 있기를 원합니다.

어떤 응용 프로그램이 데이터베이스와 대화하고 있더라도 기본적으로 잘못된 데이터를 삽입해서는 안됩니다. 그래서...

CREATE TABLE IF NOT EXISTS tblFoo (
  foo_id int(11) NOT NULL AUTO_INCREMENT,
  foo_test varchar(50) NOT NULL,
  PRIMARY KEY (foo_id)
);

이 삽입 작업을 계속 수행 할 수 있습니다.

INSERT INTO tblFoo (foo_test) VALUES ('');

어느 것을 예방하고 싶습니다.


  • 빈 문자열을 막을 필요가 있음을 알 수 있었고 잘못된 데이터가 데이터베이스 수준에 삽입되는 것을 방지하기 위해 배웠습니다. 그러나 경험을 통해 제약 조건의 복잡성에 따라 신중한 비용 / 이익 판단을 내려야한다는 사실을 알게되었습니다. 일부 제약 조건은 응용 프로그램 수준에서 표현하기가 쉽지만 데이터베이스 수준에서는 매우 복잡 할 수 있습니다. 더 좋지 않은 경우, 과도하게 사용하면 데이터베이스 공급 업체에 완전히 빠지게됩니다. 단지 $ 0.02. - Stijn de Witt
  • 빈 문자열은 null과 동일하지 않으므로 ' 아무튼 ' 그것에 대해. - user207421

2 답변


20

일반적으로 CHECK 제약 조건을 사용하면됩니다.

foo_test VARCHAR(50) NOT NULL CHECK (foo_test <> '')

유감스럽게도 MySQL은 제약 조건에 대한 지원이 제한되어 있습니다. 에서MySQL 레퍼런스 매뉴얼:

CHECK 절은 구문 분석되지만 모든 저장소 엔진에서는 무시됩니다.

그래서 당신이트리거사람들이 지적한대로 해결 방법으로

앞으로는PostgreSQL 살펴보기이는 데이터 무결성을보다 잘 지원한다고 간주됩니다 (다른 것들)에 의해많은 사람.


  • 그래서 ... oracle에서 NOT NULL 제약 조건에 의해 처리되는 것은 MySQL에 NOT NULL 제약 조건과 두 개의 트리거 (업데이트 전과 삽입 전)가 필요합니다. 그리고이 질문에 따라 내가 던져 질 오류가 마음에 들면 해킹이 일어납니다.stackoverflow.com/questions/24. PostgreSQL을 살펴 보는 것이 가장 좋은 조언 일 것입니다! 감사! - Whakkee
  • PostgreSQL은 그 자체만으로도 한계가 있습니다. 그러나, 많은 사람들이 (처음 배운) PHP / MySQL 세계에서 벗어나지 못했고, 나는 정말로 그들이 놓친 것을 발견하기 위해 적어도 한번 신선한 공기를 마시는 것이 좋습니다. 그래도 원한다면 다시 돌아가십시오 ;-) - jholster
  • MariaDB에서 사용할 수있는 CHECK CONSTRAINT 지원10.2.1(MDEV-7563). - Samuel Harmer

10

공백 문자 삽입을 방지하기 위해 트리거를 사용할 수 있습니다.

빠르지 않고 간결하지도 않고 예쁘지도 않지만 ...

예:

  1. 표 만들기 :

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. 빈 문자열을 확인하고 허용하지 않으려면 '삽입하기'트리거를 만듭니다.

    mysql> delimiter $
    
    mysql> create trigger foo before insert on yar
        -> for each row
        -> begin
        -> if new.val = '' then
        -> signal sqlstate '45000';
        -> end if;
        -> end;$
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> delimiter ;
    
  3. 열에 null 및 빈 문자열을 삽입하십시오.

    mysql> insert into yar values("");
    ERROR 1644 (45000): Unhandled user-defined exception condition
    
    mysql> insert into yar values(NULL);
    ERROR 1048 (23000): Column 'val' cannot be null
    
    mysql> insert into yar values ("abc");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from yar;
    +-----+
    | val |
    +-----+
    | abc |
    +-----+
    1 row in set (0.00 sec)
    

연결된 질문


관련된 질문

최근 질문