sql >> Database >  >> RDS >> Mysql

MYSQL Tabel maken met standaardwaarde (expressie) naar een kolom

Hoe zit het met een schema als

CREATE TABLE employee
(
employeeid INT PRIMARY KEY AUTO_INCREMENT,
firstname varchar(255)
);

CREATE INDEX part_of_firstname ON employee (firstname(4));

Zo kun je vrij snel opzoekingen uitvoeren met je natuurlijke primaire sleutel, terwijl je een kunstmatige primaire sleutel krijgt en je niet dwingt om te denormaliseren.

EXPLAIN SELECT * FROM EMPLOYEE WHERE EMPLOYEEID = 1 AND FIRSTNAME LIKE 'john%';

+----+-------------+----------+-------+---------------------------+---------+---------+-------+------+-------+
| id | select_type | table    | type  | possible_keys             | key     | key_len | ref   | rows | Extra |
+----+-------------+----------+-------+---------------------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | employee | const | PRIMARY,part_of_firstname | PRIMARY | 4       | const |    1 |       |
+----+-------------+----------+-------+---------------------------+---------+---------+-------+------+-------+

Aangezien het 0001-gedeelte van de primaire sleutel uniek genoeg is om de gebruiker te identificeren, hoeft u de naam natuurlijk helemaal niet op te vragen.

Als je erop staat om vooraf te berekenen, zou dit moeten werken

CREATE TABLE employee
(
employeeid INT PRIMARY KEY AUTO_INCREMENT,
specialid VARCHAR(255),
firstname VARCHAR(255)
);

CREATE INDEX employee_specialid ON employee (firstname(4));

DELIMITER ;;
CREATE TRIGGER employeeid_trigger BEFORE insert ON employee
FOR EACH ROW
BEGIN
SET new.specialid = CONCAT(LPAD((SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'employee'), 4, '0'), SUBSTRING(new.firstname, 1, 4));
END
;;
DELIMITER ;

Testen:

mysql> insert into employee (firstname) values ('johnathan');
Query OK, 1 row affected (0.04 sec)

mysql> insert into employee (firstname) values ('johnathan');
Query OK, 1 row affected (0.02 sec)

mysql> insert into employee (firstname) values ('johnathan');
Query OK, 1 row affected (0.02 sec)

mysql> select * from employee;
+------------+-----------+-----------+
| employeeid | specialid | firstname |
+------------+-----------+-----------+
|          1 | 0001john  | johnathan |
|          2 | 0002john  | johnathan |
|          3 | 0003john  | johnathan |
+------------+-----------+-----------+
3 rows in set (0.00 sec)

Dit is een soort hack, en information_schema is niet beschikbaar op sommige DB's waar je geen controle over hebt.



  1. SQRT() Functie in Oracle

  2. mysql converteert meerdere rijen naar kolommen in een enkele rij

  3. Oracle PL/SQL-verzamelingen - Elementen toevoegen aan een bestaande tabel

  4. MYSQL JOIN op meerdere tafels geeft geen resultaten