jihyunjeongme / python-restapi-minitwitter

sign up coding
0 stars 0 forks source link

sqlalchemy.exc.IntegrityError: (mysql.connector.errors.IntegrityError) 1062 (23000): Duplicate entry '1' for key 'PRIMARY' #4

Closed jihyunjeongme closed 5 years ago

jihyunjeongme commented 5 years ago

image

이유는 user 테이블에 email 필드가 UNIQUE INDEX로 걸려있기 때문이다.

나는 INSERT IGNORE로 해결

database.execute(
        text(
            """
        INSERT IGNORE INTO users (
            id,
            name,
            email,
            profile,
            hashed_password
        ) VALUES (
            :id,
            :name,
            :email,
            :profile,
            :hashed_password
        )
    """
        ),
        new_users,
    )

이럴 때는 3가지 옵션이 있다.

  1. INSERT IGNORE mysql> INSERT IGNORE INTO user(email, name) VALUES('dbstjq91@gmail.com', '송윤섭'); Query OK, 0 rows affected (0.00 sec) 만약 중복이 발생한다면 지금 삽입하려는 ROW를 무시한다.

결국 원래의 ROW만 남는다.

  1. REPLACE INTO mysql> REPLACE INTO user(email, name) VALUES('dbstjq91@gmail.com', '송윤섭'); Query OK, 2 rows affected (0.00 sec) INSERT INTO ... 형태의 쿼리를 REPLACE INTO ...로 바꿔서 사용하면되는데

이 때 기존의 ROW는 삭제되고 지금 실행하는 ROW가 삽입된다.(이 때문에 2 rows affected 가 나온다.)

따라서 Primary Key로 Auto Increment 옵션을 사용하고 있다면 값이 증가된 ROW가 남는다.

  1. ON DUPLICATE KEY UPDATE INSERT INTO user(email, name) VALUES('dbstjq91@gmail.com', '송윤섭1') ON DUPLICATE KEY UPDATE name=VALUES(name); Query OK, 2 rows affected (0.01 sec) 말 그대로 DEPLICATE KEY일 때는 UPDATE를 하라는 쿼리이다.

UPDATE할 필드를 지정할 수 있다.

원래의 ROW에 해당 필드만 UPDATE하기 때문에 Auto Increment 값은 변하지 않는다.