Я действительно застрял здесь, у меня есть этот PHP-скрипт:
<?php $databasehost = "localhost"; $databasename = ""; $databasetable = ""; $databaseusername=""; $databasepassword = ""; $fieldseparator = ","; $lineseparator = "\n"; $enclosedbyquote = '"'; $csvfile = "db-core/feed/csv/csv.csv"; if(!file_exists($csvfile)) { die("File not found. Make sure you specified the correct path."); } try { $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename", $databaseusername, $databasepassword, array( PDO::MYSQL_ATTR_LOCAL_INFILE => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); } catch (PDOException $e) { die("database connection failed: ".$e->getMessage()); } $pdo->exec("TRUNCATE TABLE `$databasetable`"); $affectedRows = $pdo->exec(" LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." REPLACE INTO TABLE `$databasetable` FIELDS OPTIONALLY ENCLOSED BY ".$pdo->quote($enclosedbyquote)." TERMINATED BY ".$pdo->quote($fieldseparator)." LINES TERMINATED BY ".$pdo->quote($lineseparator)." IGNORE 1 LINES"); echo "Loaded a total of $affectedRows records from this csv file.\n"; ?>
Таким образом, вы можете видеть, что этот скрипт обрезает мою таблицу с CSV-файлом. Он заменяет все данные, находящиеся в настоящее время в таблице MySQL.
Эти данные используются для создания страницы с листингом, содержащей автомобили, которые находятся на складе, каждая строка содержит данные для одного транспортного средства. Этот скрипт запускается один раз в день, чтобы заменить автомобили, которые больше не находятся на складе.
Теперь я хочу дать каждой из моих строк SQL свою собственную страницу, мне сказали, что мне нужно будет использовать атрибут «NOT NULL AUTO_INCREMENT» на ключе «id».
Однако видно ли, что мой стол усекает, если идентификатор удаляется каждый раз, когда запускается мой скрипт?
Могу ли я добавить что-нибудь в свой сценарий для борьбы с этой проблемой?
благодаря
Да. Усечение таблицы эквивалентно delete from table
и уничтожению всех записей.Но auto_increment не будет снова сброшен на 0. Последнее используемое значение auto_inc является частью метаданных таблицы и не зависит от операции усечения.
Если у вас есть записи 0-> 100, усечь таблицу, затем добавить новые записи, они начнут с # 101 и начнут подниматься оттуда.
Если вы хотите, чтобы значение auto_increment было сброшено после усечения, вам нужно будет:
TRUNCATE TABLE foo; // delete all records ALTER TABLE foo SET auto_increment=1; // reset auto-increment to 1 INSERT ...
Итак, yep … получается, что truncate перезагружает значение auto_increment. Определенно кажется неправильным, так как он также, по-видимому, не будет обрабатывать каскадные удаления при усечении. Репопуляция усеченной таблицы, которая используется в качестве внешнего ключа в другом месте, несомненно, приведет к неправильной записи записей.