2010-03-25 6 views
27

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

나는 당신의 데이터베이스와 대화하는 애플리케이션이 무엇이든 기본적으로 잘못된 데이터를 삽입해서는 안된다는 것을 알았다. 그래서 ...

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 (''); 

합니다.

+3

빈 문자열을 방지해야 할 필요성을 느낄 수 있으며 잘못된 데이터가 데이터베이스 수준에 삽입되는 것을 방지하기 위해 배웠습니다. 그러나 경험은 제약 조건의 복잡성을 기반으로 신중한 비용/이익 판단을 내려야한다고 가르쳐 왔습니다. 일부 제약 조건은 응용 프로그램 수준에서 표현하기가 쉽지만 데이터베이스 수준에서는 매우 복잡 할 수 있습니다. 더 좋지 않은 경우, 과도하게 사용하면 데이터베이스 공급 업체에 완전히 빠지게됩니다. 단지 $ 0.02. –

답변

15

는 일반적으로 당신이 할 것이라고 CHECK 제약 조건을 가진 :

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

불행히도 MySQL은 제한적으로 지원을하고있다 제약 조건. MySQL Reference Manual :

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

사람들이 지적한대로 그 이유는 triggers을 해결 방법으로 사용해야하는 이유입니다.

미래에는 데이터 무결성 (other things)을 더 잘 지원하는 것으로 간주되는 take a look at PostgreSQLmany people으로 지정할 수 있습니다.

+1

그래서 ... oracle은 NOT NULL 제약 조건에 의해 처리되며, MySQL에는 NOT NULL 제약 조건과 두 개의 트리거 (업데이트 전과 삽입 전)가 필요합니다. 그리고이 질문에 따라 내가 던져 질 오류가 마음에 들면 해킹이 있습니다. http : // stackoverflow.co.kr/questions/24. PostgreSQL을 살펴 보는 것이 가장 좋은 조언 일 것입니다! 감사! – Whakkee

+2

PostgreSQL에도 고유 한 제한이 있습니다. 그러나, 많은 사람들이 (처음 배운) PHP/MySQL 세계에서 벗어나지 못했고, 나는 정말로 그들이 놓친 것을 발견하기 위해 적어도 한번 신선한 공기를 마시는 것이 좋습니다. 그래도 여전히 원하면 다시 돌아 오십시오 .- – jholster

+0

[10.2.1] (https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/)에서 MariaDB에서 사용할 수있는 CHECK CONSTRAINT 지원 ([ MDEV-7563] (https://jira.mariadb.org/browse/MDEV-7563)). –

7

트리거를 사용하여 빈 문자열 삽입을 방지 할 수 있습니다.

그것은이다 ... 빨리하지, 아주 간결하지 꽤 아니지만,

예 :

  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)과 blankstring 삽입 :

    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) 
    
관련 문제