Jak zapisac tablie z ID do bazy danych?

0

Witam,

Mam sobie tablice:


$tab = [1,...1000]

Ktora zawiera zazwyczaj 1000 unikatowych ID. Musze zapisac wszystkie te ID w bazie danych. Wykonuje export danych. Jezeli rekord z DB zostal wyeksportowany to wrzucam go do tabeli. Jest jakas metoda jak szybko zapisac taka tablice? Czasem jest to 10 elementow w tablicy czasem 500. Obecnie jest to zapisywane przy uzyciu petli foreach() i zapisinie pojedynczych IDkow. Jedno ID rowna sie do jednego reckordu w tabeli.

1

Kilka sposobów.

SELECT * FROM (VALUES (1), (2), (344)...) x(id)
SELECT * FROM unnest(array[1,2,344,...]) x(id)
0

ooo to, to, to, to, to, to... podoba mi sie. Ale jak utworze takiego stringa z 1000 IDikow to nie zabije DB jak wysle na raz ? Moze warto podzielic to np na 200-300 ID w jednym zapytaniu? Zrobie tak i potestuje. Dzieki za pomysl.

1

A nie lepiej to wrzucać z sekwencji? Przy pewnych założeniach masz pewność że numery są unikatowe i wtedy przy insercie robisz coś w stylu
seq.nextval()
Nie kombinujesz z tablicami nie wiadomo gdzie i baza sama wszystkiego pilnuje.

0

Nie wiem czy dobrze rozumiem Twój pomysł. Moja tabeleczka wyglada ta:

class_id | class_name | datetime
---------------- | -------------------
2424 | Order | 2019-02-01 0001
103243 | Item | 2019-02-01 0002

etc

Możesz lepiej naświetlić mi jak użyć mogę sekwencje?

0

Class_id to byłby numer z sekwencji nadany przy insercie do tabeli. Zamiast robić osobną tablice z liczbami to te liczby generowały by się w locie, a sam insert obejmował by tablice z resztą danych już bez id.

0

@Marcin.Miga:


SELECT  *
FROM    unnest(ARRAY[1,2,3,4,5,6,7,8,22,33]) x
            CROSS JOIN unnest(ARRAY['test']) y
            CROSS JOIN unnest(ARRAY[NOW()]) z

Moze byc? :)

1

unnest trzeba umieć używać... Uważaj, żebyś się na tym nie przejechał...
A to, co napisałeś można krócej (i łatwiej) zapisać tak:

SELECT  x.id, 'TEST', now()
FROM    unnest(ARRAY[1,2,3,4,5,6,7,8,22,33]) x(id)

I z tym Now() też trzeba uważać. Nie wiem, co zamierzasz, ale wszystkie rekordy będą miały jednakowy czas. Jeśli zalezy ci na różnym, to zastosuj clock_timestamp()

EDIT: literówka

0
Marcin.Miga napisał(a):

unnest trzeba umieć używać... Uważaj, żebyś się na tym nie przejechał...

@Marcin.Miga: Troche slabo mnie zacheciles. Ale co zlego moglo by sie stac? :D Jak wrzuce 500 unikatowych IDkow to powinno zawsze tyle samo zapisac :D Prawda ? :D

0

Bo unnest() może być zarówno przed FROM, jak i po. I w zależności do tego gdzie jest inaczej się zachowuje...
http://sqlfiddle.com/#!17/9eecb/32880

0

@Marcin.Miga: Jedna mala rzecz do Twojego ostatniego zapytania. Jak mam wykonac 100k pojedynczych insertow a np wykonac z 100 takich Twoich zapytan. To jezeli chodzi o performance to zmieni to co? Czy bedzie znacznie szybciej wyslac i wykonac Twoje zapytania do DB? Jaka moze byc realna roznica? Cos tak czuje, ze moze nawet nieznaczna.

1

Dla takich ilości, to lepiej tabela tymczasowa, zaimportowanie do niej id, a potem insert... Z poziomu PHP też to zrobisz... PG_COPY_FROM

1 użytkowników online, w tym zalogowanych: 0, gości: 1