0

結合を含むselectステートメントを使用して、mySQLデータベーステーブルに列を挿入しようとしています。

私のコード:

insert into trips_last_arrival_time(start_time)
select min_arrival_time.start_time
from min_arrival_time 
            inner join trips_last_arrival_time 
            on min_arrival_time.trip_id = trips_last_arrival_time.trip_id;

私は得ています:

[Err] 1364 - Field 'trip_id' doesn't have a default value
trip_id is the primary key of both tables. 

start_time列は空白であり、nullで埋められていません。

私もUPDATE句を試しました

update trips_last_arrival_time
set trips_last_arrival_time.start_time  = (
select start_time from min_arrival_time )
where exists(
select trip_id from trips_last_arrival_time
where trips_last_arrival_time.trip_id = min_arrival_time.trip_id)

そして、テーブルmin_arrival_timeに列trip_idがあります(実際、これは両方のテーブルの主キーです!)しかし、このUPDATE句は次のようになります。

[Err] 1054 - Unknown column 'min_arrival_time.trip_id' in 'where clause'

私は何が欠けていますか?

4

3 に答える 3

1

いくつかの問題があります。

最初の更新クエリでは、trip_idが主キーであるが、デフォルト値を取得しないという問題があります。新しい値を簡単に挿入できるように、これはauto_incrementとして宣言する必要があります。createtableステートメントは次のようになります。

 trip_id int NOT NULL AUTO_INCREMENT,
 . . .
 primary key (trip_id)

これは、次のようなaltertableステートメントで修正できます。

ALTER TABLE trips_last_arrival_time CHANGE trip_id trip_id UNSIGNED NOT NULL AUTO_INCREMENT;

updateステートメントの問題は異なります。私がそれを読むことができるようにフォーマットされました:

update trips_last_arrival_time
    set trips_last_arrival_time.start_time = (
        select start_time from min_arrival_time )
    where exists(select trip_id
                 from trips_last_arrival_time
                 where trips_last_arrival_time.trip_id = min_arrival_time.trip_id
                )

WHERE句は、FROM句にも外部クエリにも含まれていないテーブルmin_arrival_timeを参照しています。代わりに、別のサブクエリにあります。この参照はコンテキスト外であるため、エラーが発生しています。

于 2012-08-16T02:23:15.453 に答える
1

既存の行に挿入しようとしています(SELECTしようとしたために存在します)。デフォルト値があるかどうかに関係なくtrip_id、これは正しい操作ではありません。UPDATEを実行する必要があります。

あなたのアップデートのために、私はあなたがこれをする必要があるとかなり確信しています:

UPDATE trips_last_arrival_time AS t, min_arrival_time AS m
    SET t.start_time = m.start_time
    WHERE t.trip_id = m.trip_id;
于 2012-08-16T02:27:51.700 に答える
0

私の意見では、あなたはtrip_idテーブルの主キーとして設定しましたが、trips_last_arrival_timeこれはデフォルト値にすることはできずnull、デフォルト値もありません。手動で独自に生成しますtrip_idか?そうでない場合は、新しいレコードを挿入するたびにサーバーが自動的に生成するようにtrip_id列を編集します。列に設定する場合は、そのデータ型が。であることを確認してください。AUTO_INCREMENTtrip_idAUTOINCREMNTint

ALTER TABLE trips_last_arrival_time CHANGE trip_id UNSIGNED AUTO_INCREMENT;

更新クエリは複雑に見えます。もう少し単純化してみてください

UPDATE trips_last_arrival_time a 
            INNER JOIN min_arrival_time b
                ON a.trip_id = b.trip_id
SET     a.start_time  = b.start_time
于 2012-08-16T02:28:58.393 に答える