2016-09-05 33 views
0

是否可以设置列,使其只能有2个不同的值中的1个。例如,现在类型是varchar(8),但我希望它只接受有效的值是“比特币”或“贝宝”。我知道我可以用PHP来做到这一点,但是MySQL有可能吗?设置列,以便只允许2个值中的1个

+0

您可以使用'ENUM'。 – 1000111

+1

为了简单和效率的缘故,您可以使用布尔值来表示一个或另一个,因为只有2个选项。 –

+0

@ php_coder_3809625 while true(pun not not:p),这可能会导致在此代码库的后续版本中出现一些巨大的扩展问题。尽管Marc可能没有计划将其扩展到其他支付处理器,但如果这个计划起飞了,他肯定希望能够添加不同于2的支付类型,并且应该计划可扩展性(在合理范围内) – Pachonk

回答

1

请与您的表名,并与您cloumn名

ALTER TABLE <table name> 
    CHANGE COLUMN <column name> ENUM('Bitcoin','Paypal') NOT NULL; 
+0

即使不更改,也需要指定新的列名称。 (换句话说,''需要在'CHANGE COLUMN'后面出现两次。)或者,使用'MODIFY'而不是'CHANGE COLUMN'。 –

+0

完美,这实际上是我正在寻找。 @Gordon Linoff解释说,但你告诉我它是如何完成的。我在phpMyAdmin中做了更改,结果非常好。 –

3

在MySQL中,您有三个或四个选择。

  • 您可以使用枚举类型。这定义了类型和允许的值。
  • 您可以将外键关系用于仅包含这两个值的参考表。
  • 您可以使用触发器来强制执行这些值。

在其他数据库中,您也可以选择使用检查约束。 MySQL实际上并没有实现这些。

1

取代如果你想去一个完全标准化的做法,我会做这样的事情:

Customer 
id auto_increment pk 
name VARCHAR(255) 
payment_type_id INT(10) 

然后有一个单独的表格:

PaymentTypes 
id auto_increment pk 
name VARCHAR(255) 

如果您使用的是InnoDB,那么您会将外键放在t他列的payment_type。

要查询的付款方式,只需连接表:

SELECT c.Name, pt.Name as 'Payment Type' 
FROM Customer c 
LEFT JOIN PaymentTypes pt ON pt.id = c.payment_type_id 

这是更好的选择之一,因为它允许支付类型的最新加法以后。

+0

这是我会做的,避免像鼠疫枚举 – Drew

+0

http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/ – Drew

相关问题