복붙노트

[SQL] 필드에 외부 키를 리팩토링

SQL

필드에 외부 키를 리팩토링

PostgreSQL의 I에서 테이블 (구입)를 리팩토링 할 필요가; 그것은 다른 테이블 (쇼핑)에 외부 키를 가지고있다. 대신에 나는 텍스트 방식으로 관계를 유지하는 두 개의 필드를 원한다. 내가 어떤 정보가 손실되지해야 테이블은 이미 데이터가 포함되어 있습니다.

Purchases.shop_id: (long)          -- is the field I need to drop
Purchases.shop: (characters)       -- will hold the Shop's name
Purchases.shop_user: (characters)  -- will hold the Shop's user name.

Shop.id: (long, pk)      -- still referenced from Purchases
Shop.name: (characters)  -- Shop's name
Shop.user: (characters)  -- Shop's user name

가게가 (이름, 사용자)에 고유 한 (또는 물론 ID로)이기 때문에 두 개의 필드가 필요합니다.

ALTER TABLE Purchases ADD COLUMN shop CHARACTER VARYING(255);
ALTER TABLE Purchases ADD COLUMN shop_user CHARACTER VARYING(255);

-- ???

ALTER TABLE Purchases DROP CONSTRAINT shop_id_fk;
ALTER TABLE Purchases DROP COLUMN shop_id;

그래서 시작과 끝은 쉽게 중간 부분 캔 누군가의 도움이됩니다? :)

나는 외래 키는이를 위해 만들어진 것으로 알고 있지만 나는 이런 식으로해야한다.

해결법

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

    1.당신이 잘못된 길을 갈 것 같다. 원래, 정규화 된 스키마는 일반적으로 우수하다. 당신이 숍 / 사용자를 표시해야하는 경우 뷰를 만들 수 있습니다.

    당신이 잘못된 길을 갈 것 같다. 원래, 정규화 된 스키마는 일반적으로 우수하다. 당신이 숍 / 사용자를 표시해야하는 경우 뷰를 만들 수 있습니다.

    하지만 당신은 그래서 여기에 간다, 당신의 이유가있을 수 있습니다 :

    UPDATE purchases p
    SET   (shop, shop_user) = (s.name, s."user")
    FROM   shop s
    WHERE  s.id = p.shop_id;
    

    식별자로 예약어 "사용자"를 사용하지 마십시오. 그리고 "이름은"하나, 좀처럼 좋은 이름입니다. 그리고 포스트 그레스에 VARCHAR (255)는 통상적으로 오해를 나타낸다.

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

    2.그래서 당신은 단순히 당신의 가게 테이블의 정보를 포함하여 구매 테이블을 업데이트하고 누락 된 조각 날 것으로 보인다. 그게 맞다면 당신은 당신이 그것을 드롭하기 전에 기존 외래 키를 사용하여 테이블을 업데이트 할 수 있습니다 :

    그래서 당신은 단순히 당신의 가게 테이블의 정보를 포함하여 구매 테이블을 업데이트하고 누락 된 조각 날 것으로 보인다. 그게 맞다면 당신은 당신이 그것을 드롭하기 전에 기존 외래 키를 사용하여 테이블을 업데이트 할 수 있습니다 :

    UPDATE purchases SET (shop, shop_user) =
        (SELECT name, user FROM shop
         WHERE shop.id = purchases.shop_id);
    
  3. from https://stackoverflow.com/questions/24558650/refactor-foreign-key-to-fields by cc-by-sa and MIT license