Ich bin "ok" bei grundlegenden MySQL, aber das ist "WAY OVER MY HEAD"!Wie importiert man Datenbanken, aktualisiert Produkte, die geändert wurden, lösche Produkte, die entfernt wurden
Ziele:
- Import Datenbank
- Update Produkte, die
- löschen Produkte geändert haben, die
- Schnell und effizient
Die Datenbanktabelle (n) sind entfernt worden sind RIESIG, Geschwindigkeit ist ein Problem.
Muss MyISAM nicht wäre inoDB schneller? Jede Datenbank befindet sich in einer eindeutigen Tabelle.
ich dies als Ausgangspunkt gegeben, was ich versuche zu tun:
CREATE TABLE `table` LIKE LiveTable
LOAD DATA INFILE..... INTO `table`
UPDATE `table` SET delete=1; -- Set the delete field to true because it will not have been updated
UPDATE `table` INNER JOIN`table`ON `LiveTable.ID`=`table.ID`
SET LiveTable.Col1=table.Col1, LiveTable.Col2=table.Col2….. delete=0
INSERT INTO LiveTable(ID,Col1,Col2,… delete=0)
SELECT ID,Col1,Col2,...FROM `table`
LEFT JOIN LiveTable
ON table.ID = LiveTable.ID
WHERE LiveTable.ID IS NULL
DELETE FROM LiveTableWHERE delete = 0
EMPTY TABLE `table`
> CREATE TABLE `product_table` (
> `programname` VARCHAR(100) NOT NULL,
> `name` VARCHAR(160) NOT NULL,
> `keywords` VARCHAR(300) NOT NULL,
> `description` TEXT NOT NULL,
> `sku` VARCHAR(100) NOT NULL,
> -- This is the only "unique identifier given, none will be duplicates"
> `price` DECIMAL(10, 2) NOT NULL,
> `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
> `updatedat` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
> `delete` TINYINT(4) NOT NULL DEFAULT '0',
> PRIMARY KEY (`sku`) ) ENGINE=myisam DEFAULT CHARSET=latin1;
>
> CREATE TABLE IF NOT EXISTS `temptable` LIKE `product_table`;
>
> TRUNCATE TABLE `temptable`; -- Remove data from temp table if for some
> reason it has data in it.
>
> LOAD DATA LOW_PRIORITY LOCAL INFILE "catalog.csv" INTO TABLE
> `temptable` FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """"
> LINES TERMINATED BY "\n" IGNORE 1 LINES (`PROGRAMNAME`, `NAME`,
> `KEYWORDS`, `DESCRIPTION`, `SKU`, `PRICE`);
>
>
> UPDATE `temptable` SET `delete` = 1; -- Set the delete field to
> true UPDATE `temptable` ttable
> INNER JOIN `product_table` mtable
> ON (mtable.sku = ttable.sku) SET mtable.programname = ttable.programname,
> mtable.name = ttable.name,
> mtable.keywords = ttable.keywords,
> mtable.description = ttable.description,
> mtable.sku = ttable.sku,
> mtable.price = ttable.price,
> mtable.created = ttable.created,
> mtable.updatedat = NOW(),-- Set Last Update
> mtable.delete = 0; -- Set Delete to NO
>
> -- Not sure what this is for... I'm LOST at this part...
> INSERT INTO `product_table` VALUES (`programname`,
> `name`,
> `keywords`,
> `description`,
> `sku`,
> `price`,
> `created`,
> `updatedat`,
> `delete`);
>
> -- This type of join requires alias as far as I know?
> SELECT `programname`,
> `name`,
> `keywords`,
> `description`,
> `sku`,
> `price`,
> `created`,
> `updatedat`,
> `delete` FROM `temptable` tmptable
> LEFT JOIN `product_table` maintbl
> ON tmptable.sku = maintbl.sku WHERE maintbl.sku IS NULL;
>
> DELETE FROM `product_table` WHERE `delete` = 0;
>
> TRUNCATE TABLE `temptable`; `` remove all the data from temporary
> table.
Danke für die Information InnoDB ist es. Ich weiß nicht, ob Sie zufällig wissen, aber der "> INSERT INTO' product_table' VALUES "Teil macht das nicht für mich ... Ich denke es fehlt etwas da ... – Brad
es beantwortet nicht das ganze Frage .... Es beantwortet jedoch einige nützliche Informationen nicht. – Brad