Çoklu problemler.
Kurulumunuz genişletildi:
CREATE TABLE a (
pk_a int PRIMARY KEY
, a int
, comment text -- added column to make effect clear
);
CREATE TABLE b (
pk_b int PRIMARY KEY
, b int
, comment text
);
INSERT INTO a VALUES (1, 11, 'comment from a')
, (2, 22, 'comment from a');
INSERT INTO b VALUES (1, 77, 'comment from b');
Bu çalışıyor:
INSERT INTO b (pk_b, b, comment)
SELECT pk_a, a, comment
FROM a
ON CONFLICT (pk_b) DO UPDATE -- conflict is on the unique column
SET b = excluded.b; -- key word "excluded", refer to target column
Sonuç:
TABLE b;
pk_b | b | comment
------+----+----------------
1 | 11 | comment from b -- updated
2 | 22 | comment from a -- inserted
Problemler
Kafa karıştırıcı table_a
ve A
demo ( @Abelisto yorumladı gibi ).
Yasal, küçük harfli, alıntılanmamış tanımlayıcıları kullanmak karışıklığı önlemeye yardımcı olur.
Gibi @Ziggy söz , ON CONFLICT
sadece gerçek çalışır benzersiz veya dışlama kısıtlama ihlalleri . Kullanım kılavuzu:
İsteğe bağlı ON CONFLICT
madde, benzersiz bir ihlali veya hariç tutma kısıtlaması ihlali hatasını yükseltmek için alternatif bir işlem belirtir.
Sonuç olarak, ON CONFLICT (b)
çalışamaz, orada bir kısıtlama yoktur. ON CONFLICT (pk_b)
İşler.
Gibi @Ziggy ayrıca söz , kaynak tablo adları görünmez içinde UPDATE
parçası. Kullanım kılavuzu:
İçindeki SET
ve WHERE
cümleleri ON CONFLICT DO UPDATE
tablonun adını (veya takma adını) kullanarak mevcut satıra ve özel excluded
tablo kullanılarak ekleme için önerilen satırlara erişebilir .
Cesur vurgu benim.
Parçadaki kaynak tablonun sütun adlarını da kullanamazsınız UPDATE
. Hedef satırın sütun adları olmalıdır . Yani gerçekten istiyorsun:
SET b = excluded.b
Kılavuz bir kez daha:
Satır başına tüm BEFORE INSERT
tetikleyicilerin etkilerinin hariç tutulan değerlere yansıtıldığına dikkat edin, çünkü bu efektler satırın ekleme dışında bırakılmasına katkıda bulunmuş olabilir.
CREATE TABLE A...
tablo oluşturura
, değiltable_a
.