ken1234566767
@ken1234566767

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

(SQL)データの重複を取り除いてINSERTする方法について

Q&A

Closed

SQL(MySQL)についての質問です。

CREATE TABLE Grade(
    id CHAR(8) NOT NULL,
    class_name char(8),
    class_id char(5)
    score int(2)
    PRIMARY KEY (id, class_id)
);

のようなテーブルを設定し、中身に

id    class_name   class_id   score
1    classA        00001      100
1    classB        00002      80
2    classA        00001      100
2    classB        00002      20

を挿入しました。
今 新しいテーブル

CREATE TABLE class(
    class_name char(8),
    class_id char(5),
    PRIMARY KEY (class_id )
);

を設定してテーブルGradeのデータ(class_name class_id)を重複なく挿入したいです。

insert into class select distinct class_name, class_id from Grade;

を試しては見たのですが重複によるエラーは改善されませんでした。

MySQL Error (1062): Duplicate entry '00001' for key 'class.PRIMARY'

なるべく新しいテーブル等を作らず手短に実行したいのですが、厳しいでしょうか

0

2Answer

Grade テーブルの id は主キーのようですが重複があるのは何故ですか?

classA, 00003 とか classC, 00001 とかが含まれている場合はどのようにしたいのでしょうか?

1Like

Comments

  1. @ken1234566767

    Questioner

    Grade テーブルの id は主キーのようですが重複があるのは何故ですか?

    本来はGradeテーブルの属性としてscoreもあり、(id, class_id) →scoreという関係があったのですが省略していました。編集して戻しておきました。

    classA, 00003 とか classC, 00001 とかが含まれている場合はどのようにしたいのでしょうか?

    class_idとclass_nameは索引従属のつもりでした。この索引従属を取り除いてGradeテーブルを第二正規形にするというのがコンセプトでした。
    わかりにくくて申し訳ないです

  2. せっかく説明いただいたのにすみませんが自分には理解できません。先の「classA, 00003 とか classC, 00001 とかが含まれている場合はどのようにしたいのでしょうか?」という私の質問に対し、もっともっと具体的に、超初心者でも分かるような解説を書いていただけませんか?

DB Fiddle で以下の入力を試したところエラーは出ませんでした。
何か入力の間違いはありませんか? 例えば "classA" と書くところで片方だけ " classA"(先頭に空白文字)となっていた場合は質問内容と同じエラーが出ます。

Schema SQL

CREATE TABLE Grade(
    id CHAR(8) NOT NULL,
    class_name char(8),
    class_id char(5),
    score int(2),
    PRIMARY KEY (id, class_id)
);

insert into Grade values (1, "classA", "00001", 100);
insert into Grade values (1, "classB", "00002", 80);
insert into Grade values (2, "classA", "00001", 100);
insert into Grade values (2, "classB", "00002", 20);

CREATE TABLE class(
    class_name char(8),
    class_id char(5),
    PRIMARY KEY (class_id)
);

insert into class select distinct class_name, class_id from Grade;

Query SQL

select * from Grade;

-- レコードが 2 件だけ出るはず
select distinct class_name, class_id from Grade;

-- レコードが 2 件だけ出るはず
select * from class;
0Like

Comments

  1. @ken1234566767

    Questioner

    いただいたコードを試してみたところ(なぜか)うまくいきました。自分のコードと見比べてみます。
    ありがとうございました。

Your answer might help someone💌