我想使用主键= 0作为我的应用程序的后备 其中id = 0表示使用System Default,以上所有都是用户定义的Entrys。没有用户访问id 0,也没有删除该表的可能性 这可能是一种罕见但通常的方式,或者我最好不要那样做。
编辑:
对于以下用法:
SELECT...FROM...WHERE IF(id=0, system_col, other_col)
答案 0 :(得分:1)
如您所知,PK不能具有重复值。
我建议将id
UNIQUE INDEX和NULL
设为系统默认值。
UNIQUE INDEX可以有多个NULL值
<强>更新强>
你可以在没有0的情况下做到这一点。这是我的测试。
mysql> select * from a;
+------+
| a |
+------+
| 1 |
| NULL |
| NULL |
+------+
3 rows in set (0.00 sec)
mysql> select a, if(a is null, "default", "not default") from a;
+------+-----------------------------------------+
| a | if(a is null, "default", "not default") |
+------+-----------------------------------------+
| 1 | not default |
| NULL | default |
| NULL | default |
+------+-----------------------------------------+
3 rows in set (0.00 sec)
答案 1 :(得分:1)
这有几个方面。它不是一个好的&#34;与#34;坏&#34;决定 - 这取决于(像往常一样)。
您的设计在概念上类似于面向对象设计中的null object pattern。通过引入&#34;默认&#34;,您可以简化代码 - 而不是始终检查&#34; null&#34;,您可以保证记录,并像任何其他记录一样对待它用于数据检索目的。您也可以通过不必检查null来获得一些性能优势(尽管我怀疑这将是一个重大影响)。
另一方面,你引入了一个magic number - 通常被认为是一件坏事,因为开发人员必须知道id为0的记录是&#34; special&#34;,以某种方式是您的应用程序所独有的(而不是null,这是一个完善的概念)。如果概念跨应用程序的各个层 - 从数据库到业务逻辑,甚至到表示层,这尤其令人讨厌。