ฉันกำลังทำงานกับสคริปต์ PHP ซึ่งนำเข้าไฟล์ CSV ( customers.csv
) ลงในตาราง MySQL (customers
)
ก่อนที่จะแทรกเนื้อหาของไฟล์ CSV ลงในตาราง mysql ฉันสำรองข้อมูลcustomers
ตารางดั้งเดิมก่อน
ฉันกำลังห่อกระบวนการนำเข้าทั้งหมด (รวมถึงการสำรองข้อมูล) ในธุรกรรม mysql (เพื่อพิจารณากรณีที่ CSV เสียหายที่ไหนสักแห่งที่อยู่ตรงกลางและเพื่อให้แน่ใจว่าการนำเข้านั้นเป็นอะตอม)
ปัญหาคือว่าย้อนกลับดูเหมือนจะไม่ทำงานเมื่อฉันเรียกมันว่าหลังจากที่INSERT INTO
คำสั่ง: เมื่อตรวจสอบฐานข้อมูลผ่านทาง phpMyAdmin ฉันสามารถดูตารางที่สร้างขึ้นใหม่และแถวภายในมันยังคงอยู่หลังจาก roollback
นี่คือบันทึกการทำงาน:
[2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] []
[2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] []
[2015-01-19 14:08:28] DEBUG: CREATE TABLE `customers__20150119_14_08_20` LIKE `customers` [] []
[2015-01-19 14:08:37] DEBUG: INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers` [] []
[2015-01-19 14:08:50] DEBUG: "ROLLBACK" [] []
ดังนั้นฉันจึงสงสัยว่าเหตุใดจึงROLLBACK
มีการเรียกใช้depsite ธุรกรรมจะไม่ถูกยกเลิก ฉันเข้าใจว่าCREATE TABLE
ไม่ใช่ธุรกรรมในธรรมชาติและไม่สามารถย้อนกลับได้ แต่ฉันสมมติว่าINSERT INTO
เพราะมันเกี่ยวข้องกับการแทรกแถว (ไม่ได้กำหนดสคีมา) จริง ๆ แล้วจะทำธุรกรรมและหลังจากย้อนกลับฉันจะถูกทิ้งไว้กับตารางปลายทางที่ว่างเปล่า ทำไมมันไม่เป็นเช่นนั้น?
และนี่คือผลลัพธ์SHOW CREATE TABLE customers
(ดังนั้นตารางของฉันInnoDb
):
CREATE TABLE `customers` (
`Code` varchar(32) NOT NULL,
`Name` varchar(128) DEFAULT NULL,
`Price` varchar(128) DEFAULT NULL,
PRIMARY KEY (`Code`),
KEY `Price` (`Price`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
และนี่คือผลลัพธ์ของตาราง desination:
CREATE TABLE `customers__20150119_14_08_20` (
`Code` varchar(32) NOT NULL,
`Name` varchar(128) DEFAULT NULL,
`Price` varchar(128) DEFAULT NULL,
PRIMARY KEY (`Code`),
KEY `Price` (`Price`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
create table
แล้วstart transaction, insert, rollback
?