복붙노트

[SQL] MySQL은, 더 나은 NULL 또는 빈 문자열을 삽입하는?

SQL

MySQL은, 더 나은 NULL 또는 빈 문자열을 삽입하는?

나는 다른 분야의 많은이있는 웹 사이트에서 양식을 가지고있다. 일부는 의무적으로있는 동안 일부 필드는 선택 사항입니다. 내 DB I에서는 사용자가 어떤 데이터를 입력하지 않은 DB 컬럼에 NULL 값 또는 빈 문자열을 삽입하는 좋은 연습이다, 모든 값을 유지하는 테이블이?

해결법

  1. ==============================

    1.당신이 구별 할 수 NULL을 사용하여 "데이터를 넣어 없다"와 "빈 데이터를 넣어".

    당신이 구별 할 수 NULL을 사용하여 "데이터를 넣어 없다"와 "빈 데이터를 넣어".

    좀 더 차이 :

  2. ==============================

    2.혹시 데이터베이스를 전환 계획이있는 경우, 고려해야 할 한 가지, 오라클은 빈 문자열을 지원하지 않는다는 것입니다. 그들이 WHERE somefield = ''와 같은 절을 사용하는 그들은 자동으로 NULL로 변환됩니다 그리고 당신은하지 쿼리 할 수 ​​있습니다.

    혹시 데이터베이스를 전환 계획이있는 경우, 고려해야 할 한 가지, 오라클은 빈 문자열을 지원하지 않는다는 것입니다. 그들이 WHERE somefield = ''와 같은 절을 사용하는 그들은 자동으로 NULL로 변환됩니다 그리고 당신은하지 쿼리 할 수 ​​있습니다.

  3. ==============================

    3.한 가지 유념해야 할 점은 NULL이 코드 경로가 훨씬 더 어렵게 만들 수 있다는 것입니다. 파이썬에서 예를 들어 대부분의 데이터베이스 어댑터 /으로 ORMs 없음에 NULL을 매핑합니다.

    한 가지 유념해야 할 점은 NULL이 코드 경로가 훨씬 더 어렵게 만들 수 있다는 것입니다. 파이썬에서 예를 들어 대부분의 데이터베이스 어댑터 /으로 ORMs 없음에 NULL을 매핑합니다.

    같은 것들을 그래서 :

    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
    

    이 발생할 수 있습니다 "안녕하세요, 없음 조 미상!" 그것을 방지하기 위해이 같은 코드가 필요합니다 :

    if databaserow.title:
        print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
    else:
        print "Hello, %(firstname) %(lastname)!" % databaserow
    

    상황이 훨씬 더 복잡 할 수있다.

  4. ==============================

    4.MySQL은 데이터베이스의 일관성을 위해 삽입 NULL로 더 나은. 외부 키는 NULL로하지만 빈 문자열로 저장 될 수있다.

    MySQL은 데이터베이스의 일관성을 위해 삽입 NULL로 더 나은. 외부 키는 NULL로하지만 빈 문자열로 저장 될 수있다.

    당신은 제약에서 빈 문자열에 문제가있을 것이다. 당신은 외래 키 제약 조건을 만족하는 독특한 빈 문자열와 가짜의 레코드를 삽입 할 수 있습니다. 내가 추측하는 나쁜 관행.

    참조 : 외래 키가 NULL 및 / 또는 복제 될 수 있을까?

  5. ==============================

    5.나는 가장 좋은 방법은 여기에 어떻게 될지 모르겠지만, 당신은 빈 문자열에서 평균 뭔가 다른에 널 (null)을 일반적으로 잘못을 널 찬성 원하는하지 않는 한, 사용자의 입력은 빈 문자열 정의를 일치합니다.

    나는 가장 좋은 방법은 여기에 어떻게 될지 모르겠지만, 당신은 빈 문자열에서 평균 뭔가 다른에 널 (null)을 일반적으로 잘못을 널 찬성 원하는하지 않는 한, 사용자의 입력은 빈 문자열 정의를 일치합니다.

    나는 당신이 당신이 그 (것)들을 다르게하는 방법을 정의 할 필요가 말하고 있습니다. 때로는 때로는하지 않는, 그들이 다른 가지고 의미가 있습니다. 그렇지 않은 경우, 하나를 선택하고 그것으로 스틱. 내가 말했듯이, 나는 대부분의 시간을 NULL을 선호하는 경향이있다.

    아, 그리고 열이 null의 경우, 레코드가 선택이 널 열의가 아닌 선택이, 해당 열의 기반으로 (SQL 용어로, where 절을 가지고) 것을 덜 거의 모든 쿼리에 표시 할 것을 염두에 곰 물론이야.

  6. ==============================

    6.(즉, 필수 양식 필드)이 고유 인덱스에서 여러 열을 사용하고이 열 중 적어도 하나는 필수 경우 NULL로 인덱스에 다른 열을 설정하면, 당신은 중복 행을 끝낼 수 있습니다. NULL 값이 고유 한 컬럼에서 무시되어 있기 때문이다. 이 경우, 중복 행을 방지하기 위해 고유 인덱스의 다른 열에서 빈 문자열을 사용합니다.

    (즉, 필수 양식 필드)이 고유 인덱스에서 여러 열을 사용하고이 열 중 적어도 하나는 필수 경우 NULL로 인덱스에 다른 열을 설정하면, 당신은 중복 행을 끝낼 수 있습니다. NULL 값이 고유 한 컬럼에서 무시되어 있기 때문이다. 이 경우, 중복 행을 방지하기 위해 고유 인덱스의 다른 열에서 빈 문자열을 사용합니다.

    COLUMNS IN A UNIQUE INDEX:
    (event_type_id, event_title, date, location, url)
    
    EXAMPLE 1:
    (1, 'BBQ', '2018-07-27', null, null)
    (1, 'BBQ', '2018-07-27', null, null) // allowed and duplicated.
    
    EXAMPLE 2:
    (1, 'BBQ', '2018-07-27', '', '')
    (1, 'BBQ', '2018-07-27', '', '') // NOT allowed as it's duplicated.
    

    여기에 몇 가지 코드는 다음과 같습니다

    CREATE TABLE `test` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `event_id` int(11) DEFAULT NULL,
      `event_title` varchar(50) DEFAULT NULL,
      `date` date DEFAULT NULL,
      `location` varchar(50) DEFAULT NULL,
      `url` varchar(200) DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    

    이제이 INSERT가 중복 행을 수 있습니다 볼 수 있습니다 :

    INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
    `url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
    
    INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
    `url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
    

    이제이를 삽입하고 허용하지 않는다 확인 :

    INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
    `url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
    
    INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
    `url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
    

    그래서, 여기에서 잘못 옳고가 없습니다. 당신이 당신의 비즈니스 규칙에 가장 적합한 결정에 그것은이야.

  7. from https://stackoverflow.com/questions/1267999/mysql-better-to-insert-null-or-empty-string by cc-by-sa and MIT license