2012-04-18 3 views
3

PHPMyAdmin을 사용하고 있으며 내 테이블의 열에 NOT NULL 제약 조건을 추가하려고합니다.열에 NOT NULL 제약 조건 추가

는 phpMyAdmin을 내 다음 쿼리를 허용합니다

ALTER TABLE `wall` MODIFY `token_message` varchar(40) NOT NULL; 

을하지만 난 여전히 빈 문자열 (= NULL), 그 이유를 이해하지를 삽입 할 수 있습니다.

추신 :이 제약 조건을 추가하기 위해 다른 쿼리를 사용하려면 PHPMyAdmin에서 작동하지 않는 다음 3 가지를 시도했음을 유의하십시오. (오류 종류 : # 1064 - 오류가 있습니다. 당신의 SQL 구문,은) 설명서를 확인하십시오

ALTER TABLE `wall` ALTER COLUMN `token_message` SET NOT NULL; 
ALTER TABLE `wall` ALTER COLUMN `token_message` varchar(40) NOT NULL; 
ALTER TABLE `wall` MODIFY `token_message` CONSTRAINTS token_message_not_null NOT NULL; 
+0

가 정의이 쿼리를 사용하는 "내 phpMyAdmin을 작동하지 않습니다를." 아마도 당신은 이미 그 열에'null' 값을 가지고있을 것입니다.이 경우 DB는 당신이 그 제약 조건을 추가하도록하지 않을 것입니다. (최소한'null' 값을'null' 이외의 값으로 만들지 말고). –

+0

새 열을 만들고 데이터를 복사하려고 했습니까? – Hajo

+0

나는 이미 그 열에 null 값을 가지고 있지 않다는 것을 확인했다. 3 가지 다른 쿼리를 시도 할 때 오류가 있습니다 : # 1064 - SQL 구문에 오류가 있습니다 – Anon

답변

5

당신이 쓴, 오해 같은 소리 "나는 아직도 빈 문자열 (= NULL)을 삽입 할 수 있습니다." SQL에서 빈 문자열은 NULL로 평가되지 않으며 반대의 경우도 마찬가지입니다. 빈 문자열을 삽입하고 SELECT from wall where token_message is NULL을 사용해보십시오. 다시 0 행을 가져와야합니다. 그런 다음 열의 값으로 NULL (따옴표 제외)을 지정하는 곳에 삽입을 시도하면 예상되는 오류 메시지가 나타납니다.

이러한 테스트가 예상대로 작동하면 모든 것이 정상이며 문제는 실제로 빈 문자열이 삽입되는 것을 방지하려는 것입니다. this question에서 제안 사항을 확인하거나 유효성 검사 중에 검색어 앞에 빈 문자열이 있는지 확인하십시오.

+1

올바른 테스트는'where token_message is NULL'입니다. Null을'='로 비교할 수는 없습니다. –

+0

감사합니다. 나는 예기치 않은 유형 변환을 설명하는 덜 엄격한 비교를 제공한다고 가정했지만, 그것은 SQL에서 작동하는 방식과는 완전히 다릅니다 (전체 3 진 논리가 얼마나 중요한지 고려하여 지금까지 알아야합니다). 내 대답을 편집했습니다. – octern

2

MySQL의 열 변경 구문을 사용하면 열을 완전히 다시 지정해야합니다. 당신은 단지 열 하나 개의 속성을 변경할 수 없습니다, 당신은 완전히 다시 정의 할 필요가 :

ALTER TABLE wall MODIFY token_message varchar(40) NOT NULL default '' 

허용되는 유일한 'SET'버전은 기본값을 변경하는 것입니다.

심판 : http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

+0

이것은 사실이며 OP가 첫 번째 시도가 작동하지 않은 후에 시도한 대체 쿼리와 관련이 있습니다. 하지만 원래의 문제를 설명 할 수는 없습니다. 왜냐하면 처음 시도한 쿼리가 완전히 합법적이며 받아 들여졌 기 때문입니다 (기본값은 없었지만 선택 사항입니다). – octern

0

나는 이것이 당신의 입력을 닦고의 문제라고 생각합니다. 앞에서 언급 한 바와 같이 빈 문자열 ('')은 sql의 NULL 값이 아닙니다. 이 빈 문자열로 공간의 수를 자릅니다

CREATE PROC InsertIntoMyDb (@MyVarChar VARCHAR(2000)) AS 

SET @MyVarChar = NULLIF(RTRIM(LTRIM(@MyVarChar)), '') 

INSERT INTO [TBL] (MyVarChar) 
VALUES @MyVarChar 

하는에 빈 문자열을 설정 :이 처리하는 가장 좋은 방법은 빈 문자열, 심지어 공백 문자를 제거합니다 가게 절차를 통해 업데이트를 허용하는 것입니다 NULL로 설정하면 이미있는 제약 조건에 따라 NULL 값이 삽입되지 않습니다.

+0

질문은 SQL-Server가 아닌 MySQL로 태그가 지정됩니다. –

+0

죄송합니다. 동일한 프로세스, 다른 구문. –

0

봅니다 즉

Alter table table_name 
change column_name column_name datatype(length) definition 

,

Alter table wall 
change tocken_message tocken_message varchar(40) NOT NULL DEFAULT