bhylu.com

Advertisements

MySQL DEFAULT and AUTO_INCREMENT

Use defaults and generated IDs while keeping required domain decisions explicit.

How it works

A DEFAULT supplies a value when an insert omits the column. It is not a repair mechanism for arbitrary invalid input. AUTO_INCREMENT supplies an identity when the key is omitted, but it does not promise gap-free business numbering. This example adds a new part with the default zero quantity, then reads the connection’s generated ID. The operation is valid in a fresh copy of the fixture where IDs one through four already exist.

Run in a disposable MySQL lab

Use Oracle MySQL 8.4 with InnoDB, not Bhylu’s SQLite playground. The examples were reviewed on MySQL 8.4.8. XAMPP may provide MariaDB, which has different feature and collation behaviour. Check your actual server before running the script. These lessons do not require a change to Bhylu’s PHP, Apache or normal database service.

  1. On a separate lab instance, create the empty bhylu_mysql_lab schema. Stop if it already exists; do not overwrite an existing database.
  2. Select that schema and import the complete repair-parts seed once. It sets the documented session mode, utf8mb4 collation, UTC and English date-name locale.
  3. Run this lesson in a fresh copy of the seed, not after another lesson’s writes. Use the command-line client or a compatible editor. DELIMITER lines are client instructions for stored-program examples.

Download this complete lesson script. Its setup is the linked seed; review the dataset before changing it. Administrative and destructive examples are restricted to the specifically named disposable objects. Every script repeats the session settings because each new connection has its own session. No MySQL browser runner is currently available.

Example

lesson.sql

SET NAMES utf8mb4 COLLATE utf8mb4_0900_ai_ci;
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SET SESSION time_zone = '+00:00';
SET SESSION lc_time_names = 'en_US';
INSERT INTO parts (depot_id,name,category,unit_cost,arrived_on)
VALUES (3,'Felt pad','fabric',1.00,'2026-02-14');
SELECT LAST_INSERT_ID() AS new_id, quantity
FROM parts WHERE id = LAST_INSERT_ID();

Expected result

5 | 0

The explicit column list makes the omitted quantity intentional. LAST_INSERT_ID is associated with this connection, so an application must retrieve it through the same connection that performed the insert. Rollbacks and concurrent inserts can leave gaps. If an external document needs a separate legally meaningful sequence, design that requirement independently rather than treating the primary key as an invoice policy.

Use the official MySQL 8.4 reference for statement contracts and version details.

Advertisements