Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL创建限制值出现次数的列_Php_Mysql_Database_Database Design - Fatal编程技术网

Php MySQL创建限制值出现次数的列

Php MySQL创建限制值出现次数的列,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我目前正在用PHP和MySQL开发一个架构,出现了一个问题。我希望这不是一个荒谬的问题,但如果有答案的话,这将是非常有帮助的 以下是实际情况的简化版本。假设我有一个表,其中有3列表示多个位置。每个位置都可能是默认位置: location_id int(20), location_name varchar(255), is_default BOOL 列是默认值的值应仅为true(1)或false(0)。此外,我想确保默认设置为true的行不能超过一行。换句话说,我希望允许最大值为一个真值和无限量

我目前正在用PHP和MySQL开发一个架构,出现了一个问题。我希望这不是一个荒谬的问题,但如果有答案的话,这将是非常有帮助的

以下是实际情况的简化版本。假设我有一个表,其中有3列表示多个位置。每个位置都可能是默认位置:

location_id int(20), location_name varchar(255), is_default BOOL
是默认值
的值应仅为true(1)或false(0)。此外,我想确保默认设置为true的行不能超过一行。换句话说,我希望允许最大值为一个真值和无限量的假值:

+-------------+---------------+------------+
| location_id | location_name | is_default |
+-------------+---------------+------------+
|1            |'England'      |1           |
|2            |'America'      |0           |
|3            |'China'        |0           |
|4            |'Russia'       |0           |
+-------------+---------------+------------+
其思想是只有一个位置可以作为默认位置。有没有办法将其表示为某种数据类型或列属性?或者我必须在php中强制执行规则,只需运行两个查询,这样每当添加一个is_default column=true的位置时,旧的默认位置的is_default column=false?如果有一种方法可以在MySQL中强制执行它,那就太好了


这似乎是一个很简单的问题,我认为这很常见,但我似乎在互联网上的任何地方都找不到答案,包括MySQL引用。除非有一些明显的数据库设计缺陷,我已经设法忽略了

如果没有另一个表,我将创建一个单独的表来指定默认值,如:

default_location table
+------------+
|location_id |
+------------+
|1           |
+------------+
这样,你只能有一个


也许这属于一个设置表?

如果除一个以外的所有值都为0,我将有一个定义默认值的配置文件,并删除表中的列:

default_location_id = 1

是的,但他仍然可以将另一行添加到
default\u location
表中,他将有两个默认位置。更好的方法是两个更新查询:
更新位置集为默认值=0
更新位置集为默认值=1,其中位置id=1
@piotrekkr,感谢您的输入。的确,可以添加另一行来创建另一个默认值。这是这种方法的优点之一。请注意,这只是一个示例。此列很可能是用户表的一部分,因此每个用户都可以有自己的默认值,或者有一个系统表,其中每个系统都有自己的默认值,等等。在原始表设置中,没有任何东西可以阻止2+个位置设置为默认值。sub-table方法通过不将此“无意义”字段附加到所有城市,至少节省了一点存储空间。我也喜欢这种方法,但它仍然需要插入和更新。不确定这对OP有多重要。而且,如果这是在config/settings表中(如@Ami所建议的),则只能有一个。ConfigId、ConfigName、ConfigValue。。。ConfigName上的PK(有点像注册表表)+1或
configuration\u settings
表中的“default\u location”行,或其他内容;简而言之,无论您的配置设置在哪里。