Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql - след вмъкване игнорира се получава първичен ключ

Документацията за LAST_INSERT_ID() казва:

Знаейки това, можете да направите това многоетапен процес:

  • ВМЕСЕТЕ ИГНОРИРАНЕ
  • ако LAST_INSERT_ID(), тогава готово (вмъкнат е нов ред)
  • иначе ИЗБЕРЕТЕ своя_първичен ключ ОТ вашата таблица КЪДЕ (УНИКАЛНИ ограничения за вмъкнатите ви данни)

Пример с щати на САЩ:

id  | abbrev | other_data
 1  | AL     | ...
 2  | AK     |

UNIQUE KEY abbr (abbrev)

Сега вмъкване на нов ред:

INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done

Вмъкване на ред, който ще бъде игнориран:

INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AK','duplicate!');
> OK
SELECT LAST_INSERT_ID();
> "0"
// oops, it already exists!
SELECT id FROM `states` WHERE `abbrev` = 'AK'; // our UNIQUE constraint here
> "2"
// there we go!

Алтернативно, има възможно заобиколно решение, за да направите това в една стъпка - използвайте REPLACE INTO вместо INSERT IGNORE INTO - синтаксисът е много подобен . Имайте предвид обаче, че има странични ефекти с този подход - това може или не може да е важно за вас:

  • REPLACE изтрива+пресъздава реда
    • така че тригерите DELETE се задействат, хм,
    • също така, основният идентификатор ще бъде увеличен, дори ако редът съществува
    • INSERT IGNORE запазва старите данни за ред, REPLACE заменя го с нови данни за ред


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Недефинирана функция mysql_connect()

  2. SELECT * ОТ MySQL Linked Server, използвайки SQL Server без OpenQuery

  3. Има ли начин да се ограничи резултатът с ELOQUENT ORM на Laravel?

  4. Защо MySQL дава грешка Не е позволено да върне набор от резултати от функция?

  5. Ограничаване на порта на MySQL 3306 до локален хост с IPTABLES