Tôi là "ok" ở MySQL cơ bản, nhưng đây là "WAY OVER MY HEAD"!Cách nhập cơ sở dữ liệu, cập nhật các sản phẩm đã thay đổi, xóa các sản phẩm đã bị xóa
Mục tiêu:
- cơ sở dữ liệu nhập
- cập nhật sản phẩm đã thay đổi
- sản phẩm xóa đã được gỡ bỏ
- nhanh chóng và hiệu quả
Bảng cơ sở dữ liệu (s) là HUGE, tốc độ là một vấn đề.
Không phải MyISAM là inoDB sẽ nhanh hơn? Mỗi cơ sở dữ liệu sẽ nằm trong một bảng duy nhất.
tôi đã được đưa ra này như là một nơi bắt đầu với những gì tôi đang cố gắng để làm:
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.
Cảm ơn thông tin InnoDB. Tôi không biết nếu bạn tình cờ biết, nhưng phần "INSERT INTO' product_table' VALUES "không làm cho tôi ... Tôi nghĩ rằng nó thiếu một cái gì đó ở đó ... – Brad
nó không trả lời toàn bộ câu hỏi .... Nó không trả lời một số thông tin hữu ích mặc dù. – Brad