Diskuze: MySQL insert do dvou tabulek a jejich propojení pomocí referenční tabulky

Ostatní jazyky SQL SQL a databáze MySQL insert do dvou tabulek a jejich propojení pomocí referenční tabulky

Avatar
no.good
Člen
Avatar
no.good:

Ahoj, chtěl bych se zeptat jak se dělá v MySQL pokud mám třeba tabulku, která mi chodí každý den a tu bych chtěl rozdělit do několika tabulek. Na schématu níže ukazuji co myslím. Mám tabulku pricelist ** a tuto bych rád rozdělil do tabulek níže. První dotaz, který ukazuji dole přidává nové unikátní produkty do tabulky product. Další dotaz přidává nové unikátní kategorie do tabulky categories. U těchto dvou tabulek pořád vycházím ze záznamů z pricelist. Poslední dotaz pak vybírá tyto nové produkty a spojuje je s kategoriemi a zjištuje právě idéčka, která tyto tabulky **product ** a **categories mají a pak je vloží do tabulky category_product. (nicméně tady potom může být problém jelikož, bych tam mohl vložit duplicitní relace mezi tabulkami). Tak jsem se chtěl zeptat jestli víte jakým způsobem by se to dalo přidat jen pomocí sql. Zde pak dávám dotaz pro vytvoření zmíněných tabulek a dále jsou pak dotazy, které v tuto chvíli mám. Doufám,že jsem to vysvětlil dost jasně :) Díky

CREATE TABLE `pricelist` (
  `id_pricelist` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `product_name` varchar(100) DEFAULT NULL,
  `product_category` varchar(100) DEFAULT NULL,
  `product_price` decimal(10,2) unsigned DEFAULT NULL,
  `product_pn` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id_pricelist`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

INSERT INTO `pricelist` VALUES ('1', 'canon 200', 'Notebooks', '200.00', 'C200');
INSERT INTO `pricelist` VALUES ('2', 'HP 350', 'Notebooks', '150.00', 'HP350');
INSERT INTO `pricelist` VALUES ('3', 'Asus 300', 'Computers', '250.00', 'ABX');
INSERT INTO `pricelist` VALUES ('4', 'Asus 500', 'Computers', '175.00', 'ABAA');
INSERT INTO `pricelist` VALUES ('5', 'Asus 325', 'Printers', '120.00', 'CCA');
INSERT INTO `pricelist` VALUES ('6', 'HP Laser', 'Printers', '22.00', 'C#AA');
INSERT INTO `pricelist` VALUES ('7', 'Xerox CC', 'Scanners', '134.00', 'CCDD');


CREATE TABLE `categories` (
  `id_category` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `category_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id_category`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

INSERT INTO `categories` VALUES ('1', 'Notebooks');
INSERT INTO `categories` VALUES ('2', 'Cameras');
INSERT INTO `categories` VALUES ('3', 'Computers');


CREATE TABLE `product` (
  `id_product` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `product_name` varchar(100) DEFAULT NULL,
  `product_number` varchar(50) DEFAULT NULL,
  `insert_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id_product`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;


INSERT INTO `product` VALUES ('1', 'asus 350', '350N', '2013-11-24 17:26:42');
INSERT INTO `product` VALUES ('2', 'canon 200', 'C200', '2013-11-24 17:26:52');
INSERT INTO `product` VALUES ('3', 'HP 350', 'HP350', '2013-11-24 17:26:56');
INSERT INTO `product` VALUES ('4', 'HP 450', 'HP450', '2013-11-24 17:26:59');


CREATE TABLE `category_product` (
  `id_category_product` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `fk_category` int(11) unsigned NOT NULL,
  `fk_product` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id_category_product`),
  KEY `fk_product_category` (`fk_product`),
  KEY `fk_category_product` (`fk_category`),
  CONSTRAINT `fk_category_product` FOREIGN KEY (`fk_category`) REFERENCES `categories` (`id_category`),
  CONSTRAINT `fk_product_category` FOREIGN KEY (`fk_product`) REFERENCES `product` (`id_product`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;

INSERT INTO `category_product` VALUES ('1', '1', '1');
INSERT INTO `category_product` VALUES ('2', '1', '2');
INSERT INTO `category_product` VALUES ('3', '1', '3');
INSERT INTO `category_product` VALUES ('4', '1', '4');

Vložení nových unikátních produktů

INSERT INTO product
SELECT DISTINCT
    null,
    b.product_name,
    b.product_pn,
    NOW()
FROM
    product a
RIGHT JOIN pricelist b
ON a.product_number = b.product_pn
WHERE id_product IS NULL;

Vložení nových unikátních kategorií

INSERT INTO categories
SELECT DISTINCT
    null,
    b.product_category
FROM
    categories a
RIGHT JOIN pricelist b
ON a.category_name = b.product_category
WHERE category_name IS NULL;

Vložení záznamů do prostřední tabulky tj M:N tabulka

INSERT INTO category_product
SELECT DISTINCT
    null,
    c.id_category,
    a.id_product
FROM
    product a
JOIN pricelist b
ON a.product_number = b.product_pn
JOIN categories c
ON b.product_category = c.category_name
WHERE DATE(a.insert_date) = CURDATE();
 
Odpovědět 27.11.2013 7:15
Avatar
Kit
Redaktor
Avatar
Odpovídá na no.good
Kit:

Sloupce s názvem, který nemá být duplicitní označ UNIQUE a použij INSERT IGNORE. Pokud to má být jedním SQL dotazem, pověs na tabulku pricelist triggery, které doplní údaje i do ostatních tabulek.

Nahoru Odpovědět 27.11.2013 9:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
no.good
Člen
Avatar
no.good:

a ten INSERT IGNORE v případě že se snažím vložit do unikátního sloupce stejnou hodnotu, tak vloží jenom data, která nejsou stejná???

 
Nahoru Odpovědět 27.11.2013 9:41
Avatar
Kit
Redaktor
Avatar
Odpovídá na no.good
Kit:

Podle počtu ovlivněných řádek poznáš, zda se záznam vložil nebo ne. Slovo IGNORE zamezí chybovému hlášení. Pokud by mělo dojít ke kolizi, záznam se nevloží.

Pokud potřebuješ jiné chování, zkus REPLACE. Nejprve se vloží nový záznam a případné původní duplicitní záznamy se následně smažou.

Nahoru Odpovědět 27.11.2013 10:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
no.good
Člen
Avatar
no.good:

Tak to INSERT IGNORE je přesně to co jsem potřeboval. Díky :)

 
Nahoru Odpovědět 27.11.2013 11:02
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.