Referring MySQL ENUM in another table

前端 未结 1 1223
醉梦人生
醉梦人生 2021-01-27 02:38

I have a table SkillLevel created as

CREATE TABLE `sklllevel` (
  `Name` varchar(20) NOT NULL,
  `level` enum(\'No Experience\',\'Beginner\',\'Expert\',\'Advisor         


        
1条回答
  •  遥遥无期
    2021-01-27 03:23

    Short answer: enums are stored as a number, so technically, you could join them with tkSkill as a tinyint.

    To use it as a foreign key, you indeed need to have both tkSkill and level to be the same enum - but you need level to be a unique column to qualify as a foreign key, so add unique to it (to be really precise: for InnoDB, you can have non-unique foreign keys if you manually create the index, but non-unique foreign keys are generally a bad idea). But you should think about what your key in sklllevel should be, since now it looks as if you want Name to be the key.

    And independently from having it as key you should define tkSkill as (the same) enum to make sure they both mean the same if you at one point would like to change the enums (what is a bad idea!) and e.g. add another skilllevel; or if you want to "read" (directly understand) the value when you select directly from the table testskill without the need to join sklllevel; and if you want to insert values into tkSkill by using their enum-namoe (e.g. 'Expert' instead of 3, but you can use both) without looking them up in sklllevel.

    Longer answer: Best practice is: don't use enums. Depending on "belief", there is none to only a handful of cases when enums might be slightly useful, if at all. One could be that you don't want to use a reference table to skip a join to display the textvalue/description of an integer-id. In your setup, you are actually using a reference table and still want to use enums.

    The closest you'll get to best practice using enums would be to define tkSkill as enum in testskill and don't have the sklllevel-table (the reference table) at all.

    But again, I would urge you not to use enums. You can define your table as

    CREATE TABLE `sklllevel` (
      `Id` tinyint(4) primary key,
      `Name` varchar(20) NOT NULL,
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    and then use that id as a foreign key for tkSkill. Or even

    CREATE TABLE `sklllevel` (
      `Name` varchar(20) primary key
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    and then define tkSkill as varchar(20) and use this as a foreign key - it will use more space, though, but you will have "readable" values in the table if that was the reason for you to use enums in the first place.

    Here you can find some background to enums: 8 Reasons Why MySQL's ENUM Data Type Is Evil

    0 讨论(0)
提交回复
热议问题