sql >> データベース >  >> RDS >> Mysql

列へのデフォルト値(式)を使用したMYSQLテーブルの作成

    のようなスキーマはどうですか
    CREATE TABLE employee
    (
    employeeid INT PRIMARY KEY AUTO_INCREMENT,
    firstname varchar(255)
    );
    
    CREATE INDEX part_of_firstname ON employee (firstname(4));
    

    これにより、人工的な主キーを提供し、非正規化を強制せずに、自然な主キーを使用してかなり迅速にルックアップを実行できます。

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

    もちろん、主キーの0001部分はユーザーを識別するのに十分な一意性があるため、名前を照会する必要はまったくありません。

    事前計算を主張する場合、これは機能するはずです

    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 ;
    

    テスト:

    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)
    

    これは一種のハックであり、権限が管理されていない一部のDBではinformation_schemaを使用できません。



    1. データベースの効率を高めるための主な方法

    2. Oracle PL /SQLはサーバーのIPv4を取得しますか?

    3. 交差するタイムスパンの平坦化

    4. djangoモデルフィールドでvarchar(N)の代わりにchar(N)データ型を適用する方法