Я не думаю, что существует декларативное ограничение, способное сделать это.
Вы можете сделать это с помощью триггера, например:
DELIMITER //
CREATE TRIGGER ForceId BEFORE INSERT ON MyTable
FOR EACH ROW
BEGIN
SET NEW.id = DEFAULT;
END //
DELIMITER ;
Я только что проверил это на MySQL 5.1.41, и это похоже на работу. Если я указываю значение для id
в своем операторе INSERT
, оно игнорирует мое значение и генерирует новое значение суррогатного ключа.
INSERT INTO MyTable (id, name) VALUES (DEFAULT, 'Bill');
INSERT INTO MyTable (id, name) VALUES (123, 'John');
SELECT * FROM MyTable;
+----+-------+
| id | name |
+----+-------+
| 1 | bill |
| 2 | john |
+----+-------+