Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: korabro 05. 08. 2020, 13:41:03

Název: MySQL - zkopírování záznamu do původní tabulky kopírovaného záznamu
Přispěvatel: korabro 05. 08. 2020, 13:41:03
Potrebuji zkopirovat existujici zaznam v tabulce do tabulky ze ktere se zaznam kopiruje. Problem je s id zaznamu, ktery je zaroven primarnim klicem.
Pomoci
Kód: [Vybrat]
insert into tableA  SELECT * FROM tableA where id='34' zaznam vytvorit nelze, protoze id=id zdrojoveho zaznamu (duplicita)

Nasel jsem dve reseni problemu:
1) dynamicky generovat "insert" dotaz s vyctem sloupcu !=id
2) pouziti pomocne tabulky

Obe mi prijdou ponekud neohrabane. Da se pri kopirovani zaznamu pomoci
Kód: [Vybrat]
insert into tableA  SELECT * FROM tableA where id='34' specifikovat "vsechny sloupce, mimo id"?

Název: Re:MYSQL - zkopirovani zaznamu do puvodni tabulky kopirovaneho zaznamu
Přispěvatel: Standa Blábol 05. 08. 2020, 13:57:07
Pokud je id autoincrement pak:
insert into table (<seznam sloupcu bez id>) select <seznam sloupcu bez is> from table where....
Název: Re:MYSQL - zkopirovani zaznamu do puvodni tabulky kopirovaneho zaznamu
Přispěvatel: korabro 05. 08. 2020, 14:02:35
Pokud je id autoincrement pak:
insert into table (<seznam sloupcu bez id>) select <seznam sloupcu bez is> from table where....

To je presne reseni kde musim generovat jmena sloupcu a nebo ten list udrzovat rucne...
Název: Re:MYSQL - zkopirovani zaznamu do puvodni tabulky kopirovaneho zaznamu
Přispěvatel: Filip Jirsák 05. 08. 2020, 14:25:13
To je presne reseni kde musim generovat jmena sloupcu a nebo ten list udrzovat rucne...
Udržovat ten list ručně je správné řešení. Hvězdička je určená pro rychlé psaní ad-hoc dotazů, v aplikaci by se používat neměla. Vždycky byste měl vědět, které přesně sloupce chcete použít.
Název: Re:MYSQL - zkopirovani zaznamu do puvodni tabulky kopirovaneho zaznamu
Přispěvatel: korabro 05. 08. 2020, 14:47:27
To je presne reseni kde musim generovat jmena sloupcu a nebo ten list udrzovat rucne...
Udržovat ten list ručně je správné řešení. Hvězdička je určená pro rychlé psaní ad-hoc dotazů, v aplikaci by se používat neměla. Vždycky byste měl vědět, které přesně sloupce chcete použít.

V tomle pripade (v kontextu tabulky) skutecne potrebuji vsechny sloupce krom id. Kdyby slo pouzit neco jako * && !=id tak ho pouziji
Název: Re:MYSQL - zkopirovani zaznamu do puvodni tabulky kopirovaneho zaznamu
Přispěvatel: m-a 05. 08. 2020, 15:34:24
Mozes pouzit databazu INFORMATION_SCHEMA:

https://dev.mysql.com/doc/refman/8.0/en/information-schema-columns-table.html (https://dev.mysql.com/doc/refman/8.0/en/information-schema-columns-table.html)

SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS`
     WHERE `TABLE_SCHEMA` = 'nazovdatabazy'
     AND `TABLE_NAME` = 'tableA'
     AND `COLUMN_NAME` != 'id'

Název: Re:MYSQL - zkopirovani zaznamu do puvodni tabulky kopirovaneho zaznamu
Přispěvatel: korabro 05. 08. 2020, 16:20:40
Mozes pouzit databazu INFORMATION_SCHEMA:

https://dev.mysql.com/doc/refman/8.0/en/information-schema-columns-table.html (https://dev.mysql.com/doc/refman/8.0/en/information-schema-columns-table.html)

SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS`
     WHERE `TABLE_SCHEMA` = 'nazovdatabazy'
     AND `TABLE_NAME` = 'tableA'
     AND `COLUMN_NAME` != 'id'


ja na to sel pomoci describe, ale tohle je rozhodne snazsi. Akorat jak to muzu dostat do seznamu sloupcu pro "SELECT col1,col2..  FROM..." ?
Název: Re:MySQL - zkopírování záznamu do původní tabulky kopírovaného záznamu
Přispěvatel: Miroslav Šilhavý 05. 08. 2020, 21:58:39
Asi nejjednodušeji se to dá řešit pomocí triggeru:

Kód: [Vybrat]
CREATE TRIGGER tableA_id_increment BEFORE INSERT ON tableA FOR EACH ROW SET new.id=(SELECT max(id) FROM tableA)+1;
Pak už projde:
Kód: [Vybrat]
INSERT INTO tableA (SELECT * FROM tableA);