自動インクリメントの主キーを持つテーブルがあります。
create table rt_table
(
rtID int PRIMARY KEY AUTO_INCREMENT,
rt_user_id BIGINT, /*user being retweeted*/
rt_user_name varchar(70), /*user name of rt_user_id*/
source_user_id BIGINT, /*user tweeting rt_user_id*/
source_user_name varchar(70), /*user name of source_user_id*/
Tweet_id BIGINT, /*fk to table tweets*/
FOREIGN KEY (Tweet_id) references tweets(Tweet_id)
);
別のテーブルの一部からこのテーブルを作成したいと思います。
insert into rt_table
select rt_user_id, (select user_name from users u where u.user_id = t.rt_user_id),
source_user_id, (select user_name from users u where u.user_id = t.source_user_id),
Tweet_id
from tweets t
where rt_user_id != -1;
列の数が一致しないというエラーが表示されます。これは主キーが原因です(これは自動インクリメントされる値であり、設定する必要はありません)。どうすればこれを回避できますか?
insert
ステートメントで列を明示的にリストする必要があります。
insert into rt_table (rt_user_id, rt_user_name, source_user_id, source_user_name, Tweet_id)
select rt_user_id, (select user_name from users u where u.user_id = t.rt_user_id),
source_user_id, (select user_name from users u where u.user_id = t.source_user_id),
Tweet_id
from tweets t
where rt_user_id != -1;
また、ネストされた選択よりも明示的な結合を使用する方が良いと思います。
insert into rt_table (rt_user_id, rt_user_name, source_user_id, source_user_name, Tweet_id)
select t.rt_user_id, u.user_name, t.source_user_id, su.user_name, t.Tweet_id
from tweets t left outer join
users u
on t.rt_user_id = u.user_id left outer join
users su
on t.source_user_id = su.user_id
where rt_user_id != -1;
これは、多くの場合(常にではありません)、オプティマイザが最適なクエリプランを見つけるのに役立ちます。
挿入時に主キーをNULL
に設定するだけです。
INSERT INTO rt_table
SELECT
NULL,
rt_user_id,
(SELECT
user_name
FROM
users u
WHERE u.user_id = t.rt_user_id),
source_user_id,
(SELECT
user_name
FROM
users u
WHERE u.user_id = t.source_user_id),
Tweet_id
FROM
tweets t
WHERE rt_user_id != - 1 ;