PHPMyAdmin을 사용하고 있으며 내 테이블의 열에 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;
당신은 "여전히 빈 문자열 (= NULL)을 삽입 할 수 있습니다."라고 오해하는 듯합니다. SQL에서 빈 문자열은 NULL로 평가되지 않으며 반대의 경우도 마찬가지입니다. 빈 문자열을 삽입하고 시도해보십시오.SELECT from wall where token_message is NULL
. 다시 0 행을 가져와야합니다. 그런 다음 지정 위치에서 삽입을 시도하십시오.NULL
(따옴표로 묶지 않음)을 열 값으로 사용하고 예상되는 오류 메시지를 받아야합니다.
이러한 테스트가 예상대로 작동하면 모든 것이 정상이며 문제는 실제로 빈 문자열이 삽입되지 않도록하려는 것입니다. 체크 아웃이 질문제안을 위해, 또는 쿼리 전에 유효성 검사 중에 빈 문자열을 확인하십시오.
WHERE token_message IS NULL
. Null을 다음과 비교할 수 없습니다.=
. - yper-crazyhat-cubeᵀᴹ
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
나는 이것이 당신의 의견을 문질러내는 문제라고 생각합니다. 앞에서 언급 한 바와 같이 빈 문자열 ( '')은 sql의 NULL 값이 아닙니다. 이것을 처리하는 가장 좋은 방법은 공백 문자를 포함하여 빈 문자열을 제거하는 저장 프로 시저를 통해서만 업데이트를 허용하는 것입니다.
CREATE PROC InsertIntoMyDb (@MyVarChar VARCHAR(2000)) AS
SET @MyVarChar = NULLIF(RTRIM(LTRIM(@MyVarChar)), '')
INSERT INTO [TBL] (MyVarChar)
VALUES @MyVarChar
이것은 공백을 빈 문자열로 잘라 버리고 빈 문자열을 NULL로 변환 한 다음 이미 자리에있는 제약 조건에 따라 NULL 값을 삽입하지 못하게합니다.
이 쿼리를 사용해보십시오.
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
null
값을 입력하면 해당 제약 조건을 추가 할 수 없게됩니다.null
~ 이외의 값을 치다.null
먼저). - Matt Ball