1

スキーマが異なる2つのテーブルがあります。

ベースA、テーブルT1:

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL DEFAULT '',
`uid` int(11) NOT NULL DEFAULT '0',
`language` varchar(12) NOT NULL DEFAULT ''

ベースB、テーブルT2:

`ID` int(11) NOT NULL AUTO_INCREMENT,
`Type` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
`UserID` int(11) NOT NULL,
`Name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,

この方法でT1からT2にデータを転送する必要があります。

A.T1.id    -> B.T2.ID
A.T1.title -> B.T2.Name
A.T1.uid   -> B.T2.UserID

あなたがフィールドを見ることができるようにA.T1.language、そしてB.T2.Type必要ではありません。

この移行はCSVのダンプを介して行う必要があると思います。しかし、これが私が思いついたすべてです。

何か案が?

アップデート

回答ありがとうございます。十分に明確ではないことをお許しください。私のテーブルは異なるベースにあり、異なるサーバーにさえあることを強調する必要がありました。したがって、あるテーブルから別のテーブルにフィールドを挿入するほど簡単ではありません。

4

4 に答える 4

2

UPDATESELECTクエリの組み合わせでそれを行うことができます。ただし、タイプの列があり、タイプTABLE 1の列があるため、問題が発生する可能性があります。titleVARCHAR(255)TABLE 2NameVARCHAR(100)

次のクエリでこの移行を実行できますが、列のtitle長さが100を超える行は100に短縮されます。

INSERT INTO T2 
(ID, Name, UserID) 
SELECT id, SUBSTR(title, 0, 100), uid 
FROM T1
于 2012-05-31T11:20:39.470 に答える
1

INSERT ... SELECT次のような構文を使用します

INSERT INTO `B`.`T2` (`ID`, `Name`, `UserID`)
SELECT `id`, `title`, `uid` FROM `A`.`T1`
于 2012-05-31T11:13:50.457 に答える
1

それらは同じデータベースにありますか?その場合:

INSERT INTO T2 (ID, Name, UserID) 
SELECT id, title, uid FROM T1
于 2012-05-31T11:13:59.453 に答える
1

INTだけでなくINT(10)などのintフィールドに制限を追加しなければならない理由はありますか?

データ転送の説明がベーステーブルと一致していませんか?

とにかく、ここでintを実行する可能性のある問題は、列の制限の一部が異なることです。たとえば、ソース列の文字列が宛先列よりも長い場合は、それらを同じにするか、宛先テーブルにSUBSTRINGする必要があります。 「これは私の文字列です」をVARCHAR(10)列に挿入しようとすると、切り捨てエラーが発生します。

データを宛先テーブルに挿入するには、次を使用できます。

INSERT INTO [Destination Table] (ID, Name, uid)

SELECT
  ID,
  SUBSTRING(title, 0, 100) as 'Name',
  uid
FROM
  [Source Table]

これは機能しますが、名前列のデータを犠牲にすることになります。宛先列にソーステーブルと同じデータ型と制限を与えることをお勧めします。

于 2012-05-31T11:38:54.833 に答える