2017-08-29 5 views
-2

数ヶ月前にデータベースを作成しましたが、実際はアーキテクチャがひどいです。現在、200万件近くのレコードがあります。最初はデータベースを正しく構築していないため、リクエストは非常に長くなります。関係する二つのテーブルの下 :他のテーブルに応じたSQLの変更列の種類[nvarchar to int(FK)]

テーブルA:

id (PK, int) 
category (nvarchar) 
date (datetime) 

TableBの

id (PK, int) 
category (nvarchar) 

私はカテゴリ欄に "INT" に変更との間の関係を作成したいと思いますテーブル(FK)。以下を参照してください:

テーブルA:

id (PK, int) 
category (FK, int) 
date (datetime) 

キー:PK_TableA、FK_TableB私はそれを行うためのスクリプトを構築するためのソリューションが、いくつかのヒントを聞かない

: - 変更を列 - レコードごとに カテゴリを見る> idを取る> id(int)でカテゴリ名(文字列)を置換する

ご協力ありがとう:

+0

あなたは列が数値データのみを持っていることは確かか?あなたがそれを許容することができれば、あなたが照会するときこれを回避するだけで、ここでオプションになるかもしれません。 –

+0

MySQLまたはMS SQL Serverを使用していますか?関与していない製品にはタグを付けないでください。 – jarlh

+0

@jarlh Microsoft SQL Server、間違ったタグが間違っています。 –

答えて

1

私はあなたがこのようなものから始めることができると思います。 最後に、チェック後(とにかく更新する前にテーブルをバックアップする)、tableAからCATEGORY列を削除し、必要に応じてCATEGORY_ID列の名前を変更することができます。 したい場合は、開始する前に、あなたは後で使用するためのチェックを行うことができます(末尾参照):semplicity用

SELECT CATEGORY, COUNT(*) AS RC 
FROM TABLEA 
GROUP BY CATEGORY; 

サンプルスクリプト

CREATE TABLE TABLEA (ID INT, CATEGORY VARCHAR(20), DATE_A DATETIME); 


CREATE TABLE TABLEB (ID INT, CATEGORY VARCHAR(20)); 

INSERT INTO TABLEA VALUES (1,'abc', GETDATE()); 
INSERT INTO TABLEA VALUES (2,'cde', GETDATE()); 
INSERT INTO TABLEA VALUES (3,'cde', GETDATE()); 
INSERT INTO TABLEA VALUES (4,'abc', GETDATE()); 
INSERT INTO TABLEA VALUES (5,'abc', GETDATE()); 
INSERT INTO TABLEA VALUES (6,'fgh', GETDATE()); 
INSERT INTO TABLEA VALUES (7,'zzz', GETDATE()); 

INSERT INTO TABLEB VALUES (100,'abc'); 
INSERT INTO TABLEB VALUES (200,'cde'); 
INSERT INTO TABLEB VALUES (300,'fgh'); 


SELECT * FROM TABLEA; 

ALTER TABLE TABLEA ADD CATEGORY_ID INT; 

UPDATE A SET CATEGORY_ID = B.ID 
FROM TABLEA A 
LEFT JOIN TABLEB B ON A.CATEGORY = B.CATEGORY; 


--CREATE INDEX TABLEA_CATID ON TABLEA (CATEGORY_ID); 

SELECT CATEGORY_ID, COUNT(*) AS RC 
FROM TABLEA 
GROUP BY CATEGORY_ID; 

、私はPKを追加しませんでした(しかしあなたが知っているように、彼らは "必要"です)。 CATEGORY_IDのTABLEAにFK制約を定義することをお勧めします。

+0

乾杯、それは良いスタートです。私は今何をしなければならないかを知っています。 –

1

あなたの列の名前を見てみたら、TableAのカテゴリ(nvarchar)の代わりに新しい列categoryid(FK、int)が必要だと思います。

これを取得する素朴な方法は、null可能なプロパティを持つ新しい列を作成し、それを設定し、制約を設定し、null可能なプロパティを削除し、最後にcategory(varchar)列を削除することです。列名を変更できない場合は、列を切り替えるための追加ステップをいくつか追加する必要があります。

すでに200万行があるので、新しいテーブル(TableC)を作成し、それを入力しTableAをTableC(ドロップ/名前を変更してTableAの名前を変更し、TableC TableAの名前を変更)した方がよいでしょう。

表C:

id (PK, int) 
categoryid (FK, int) 
date (datetime) 

あなたは通常、新しいテーブルを作成すると行の大規模な量の表を扱う際に、古いものを切り替えたほうが良いです。

よろしくマーティン

+0

ご返信ありがとうございます。 @etsaで提供されているコードを(いくつかの変更を加えて)使用し、列の追加/名前変更の代わりに新しい表を作成しました。今、私はスクリプトを作成するためにいくつかのテストを行っています。だから私はすでにあなたがアドバイスをしたが、感謝:) –

関連する問題