Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Tworzenie tabeli MYSQL z domyślną wartością (wyrażeniem) do kolumny

A co ze schematem takim jak

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

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

Umożliwi to dość szybkie wykonywanie wyszukiwań przy użyciu naturalnego klucza podstawowego, dając jednocześnie sztuczny klucz podstawowy i nie zmuszając do denormalizacji.

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 |       |
+----+-------------+----------+-------+---------------------------+---------+---------+-------+------+-------+

Oczywiście, ponieważ część 0001 klucza podstawowego jest wystarczająco unikalna, aby zidentyfikować użytkownika, nie musisz w ogóle pytać o nazwę.

Jeśli nalegasz na wstępne obliczenie, powinno to zadziałać

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 ;

Testowanie:

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)

To rodzaj hacka, a information_schema nie będzie dostępny w niektórych bazach danych, w których uprawnienia nie są pod twoją kontrolą.



  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.Data.MySqlClient.Replication.ReplicationManager zgłasza wyjątek System.TypeInitializationException

  2. Łączenie tabel w MySql z jednym wspólnym polem, ale różnymi wartościami wspólnego pola

  3. Błąd sprawdzania przygotowanych oświadczeń PDO

  4. przydziel plik tylko do jednej bazy danych

  5. PDO::__construct():Serwer wysłał zestaw znaków (255) nieznany klientowi. Proszę zgłosić się do programistów