3

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; 


  • " 내 PHPMyAdmin에서 작업하지 마라 "를 정의하십시오. 아마도 당신은 이미null값을 입력하면 해당 제약 조건을 추가 할 수 없게됩니다.null~ 이외의 값을 치다.null먼저). - Matt Ball
  • 새 열을 만들고 데이터를 복사하려고 했습니까? - Hajo
  • 이미 확인 했으므로 해당 열의 Null 값은 이미 없습니다. 3 다른 쿼리를 시도 할 때 오류가 있습니다 : #1064 - SQL 구문 오류가 있습니다. - Anon
  • @ MДΓΓLLLLLL이 테스트하고, NULL 값을 가진 varchar 열을 NOT NULL로 변경하면 문제가없는 제약 조건이 추가되었습니다. NULL 값은 자동으로 공백 문자열로 변경되었습니다 (데이터를 "잘라내는"것에 대한 경고와 함께). - octern

4 답변


5

당신은 "여전히 빈 문자열 (= NULL)을 삽입 할 수 있습니다."라고 오해하는 듯합니다. SQL에서 빈 문자열은 NULL로 평가되지 않으며 반대의 경우도 마찬가지입니다. 빈 문자열을 삽입하고 시도해보십시오.SELECT from wall where token_message is NULL. 다시 0 행을 가져와야합니다. 그런 다음 지정 위치에서 삽입을 시도하십시오.NULL(따옴표로 묶지 않음)을 열 값으로 사용하고 예상되는 오류 메시지를 받아야합니다.

이러한 테스트가 예상대로 작동하면 모든 것이 정상이며 문제는 실제로 빈 문자열이 삽입되지 않도록하려는 것입니다. 체크 아웃이 질문제안을 위해, 또는 쿼리 전에 유효성 검사 중에 빈 문자열을 확인하십시오.


  • 올바른 테스트는 다음과 같습니다.WHERE token_message IS NULL. Null을 다음과 비교할 수 없습니다.=. - yper-crazyhat-cubeᵀᴹ
  • 감사. 나는 예기치 않은 유형 변환을 설명하는 덜 엄격한 비교를 제공 하겠지만, SQL에서 어떻게 작동하는지 완전히 알지 못한다고 가정하고있었습니다 (이제는 삼중 논리가 얼마나 중요한지 고려해야합니다) . 내 답변을 수정했습니다. - 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


  • 이것은 사실이며 OP가 처음 시도한 후에 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

이 쿼리를 사용해보십시오.

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

연결된 질문


관련된 질문

최근 질문