복붙노트

[SQL] 나는 PRIMARY KEY로 VARCHAR를 사용할 수 있습니까?

SQL

나는 PRIMARY KEY로 VARCHAR를 사용할 수 있습니까?

나는 쿠폰 / 할인을 저장하기위한 테이블을 가지고 있고, 나는 VARCHAR입니다 기본 키, 같은 COUPON_CODE 열을 사용하고 싶습니다.

나의 근거는 즉, 각 쿠폰은 고유 코드를해야합니다, 그리고는 FROM ... WHERE COUPON_CODE = ... 제가 실행됩니다 SELECT를하는 명령 '..'

나는 어떤 조인 또는 인덱싱하고되지 않으며, 내가 거기가이 테이블에 몇 백 개 항목보다 더 많은 것을 볼 수 없습니다.

그것은이 확인 될 것 저 것 같다,하지만 난 / 생각하지 누락 아무것도가 있는지 모르겠어요.

해결법

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

    1.물론 당신은 의미에 RDBMS는 당신이 그것을 할 수 있도록 할 수있다. 대부분의 상황에서, 데이터베이스 시스템 외부에서 의미가 값이 기본 키로 선정해서는 안 :하지만 당신이 그것을 할 것인지 여부의 질문에 대한 대답은 다릅니다.

    물론 당신은 의미에 RDBMS는 당신이 그것을 할 수 있도록 할 수있다. 대부분의 상황에서, 데이터베이스 시스템 외부에서 의미가 값이 기본 키로 선정해서는 안 :하지만 당신이 그것을 할 것인지 여부의 질문에 대한 대답은 다릅니다.

    이 값은 모델링되는 시스템에서 고유 알고 있다면, 고유 인덱스 또는 테이블에 고유 제한 조건을 추가하는 것이 적절하다. 그러나 귀하의 기본 키는 일반적으로 자동 증가 번호 또는 GUID로, 약간의 "의미"값이어야합니다.

    이에 대한 근거는 간단하다 : 데이터 입력 오류 및 발생 할 비 변경 표시 것들 자주 변경됩니다. 그들은 기본 키로서 사용되는 값을 수정하는 것이 훨씬 어렵게된다.

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

    2.담요 "아니 당신이해야하지"끔찍한 조언입니다. 이것은 당신이 만드는 가정입니다하지 말아야 할 무엇 ... 사용 사례, 작업 부하, 데이터 엔트로피, 하드웨어, 등등에 따라 많은 상황에서 완벽하게 합리적이다.

    담요 "아니 당신이해야하지"끔찍한 조언입니다. 이것은 당신이 만드는 가정입니다하지 말아야 할 무엇 ... 사용 사례, 작업 부하, 데이터 엔트로피, 하드웨어, 등등에 따라 많은 상황에서 완벽하게 합리적이다.

    당신이되어 당신에게 나머지를 스캔하기 전에 결과를 아래로 축소에 도움을주고, MySQL을의 색인을 제한 할 접두사를 지정할 수 있다는 점에 유의해야한다. 당신의 접두사는 "채워"덜 독특한수록 이것은, 그러나, 시간이 지남에 덜 유용 될 수 있습니다.

    그것은 예컨대을 할 매우 간단합니다 :

    CREATE TABLE IF NOT EXISTS `foo` (
      `id` varchar(128),
      PRIMARY KEY (`id`(4)),
    )
    

    또한 접두사 (4) 열 따옴표 다음에 표시 있습니다.

    마지막으로, 당신은 인덱스 접두사는 사용하기 전에 일을하고 자신의 한계 어떻게 읽어야합니다 :

    http://dev.mysql.com/doc/refman/5.0/en/create-index.html

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

    3.그것은 특정 유스 케이스에 따라 달라집니다.

    그것은 특정 유스 케이스에 따라 달라집니다.

    테이블은 정적 만 값의 짧은 목록이 있습니다 (이것은 DB의 수명 기간 동안 변경 것이라고 단지 작은 기회가) 경우,이 구성을 권장합니다 :

    CREATE TABLE Foo 
    (
        FooCode VARCHAR(16), -- short code or shortcut, but with some meaning.
        Name NVARCHAR(128), -- full name of entity, can be used as fallback in case when your localization for some language doesn't exist
        LocalizationCode AS ('Foo.' + FooCode) -- This could be a code for your localization table... 
    )
    

    테이블은 기본 키가 최상의 솔루션으로 INT를 사용하여, 전혀 정적이지 물론,의.

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

    4.그것은 확실히 괜찮습니다. 항목의 수백 단지 몇 가지로, 빠른 것입니다.

    그것은 확실히 괜찮습니다. 항목의 수백 단지 몇 가지로, 빠른 것입니다.

    당신은 기본 키 (INT의 AUTO_INCREMENT)과 독특한로 설정하여 COUPON_CODE 등으로 고유 ID를 추가 할 수 있습니다. 다른 테이블에서 요청을 할 필요가 그래서 경우는 VARCHAR보다 사용 INT에 좋습니다

  5. from https://stackoverflow.com/questions/19299874/can-i-use-varchar-as-the-primary-key by cc-by-sa and MIT license