2008-11-06 103 views
56

我想要做这样的事情:我可以在MySql中使用函数作为默认值吗?

 

create table app_users 
(
    app_user_id smallint(6) not null auto_increment primary key, 
    api_key  char(36) not null default uuid() 
); 
 

然而,这导致了错误,有没有办法,呼吁MySQL中的默认值的功能?

谢谢。

回答

97

不,你不能。

然而,你可以很容易地创建一个触发器来做到这一点,如:

 
CREATE TRIGGER before_insert_app_users 
    BEFORE INSERT ON app_users 
    FOR EACH ROW 
    SET new.api_key = uuid(); 
+1

@查看http://stackoverflow.com/questions/6280789/generate-guid-in-mysql-for-existing-data填充现有行中的UUID。 – 2013-10-22 17:09:40

+1

这与具有DEFAULT值不完全相同。如果值为NULL,那么如何将此答案更改为仅设置键? – ToolmakerSteve 2015-04-01 17:38:28

+0

我用md5(uuid())修改它,并且工作正常。我的问题好吗? – 2015-05-13 16:46:05

8

不幸的是,MySQL 5需要默认的常量。这个问题在下面的链接中有更详细的讨论。但唯一的答案是允许null并添加一个表触发器。

MySQL最近才接受UUID作为其数据库包的一部分,它不像我们希望的那样功能丰富。

http://www.phpbuilder.com/board/showthread.php?t=10349169

+0

我要补充一点,让NULL和依赖触发器可能会工作,但大多数开发人员会认为这是一个非常黑客的解决方案。我不会亲自推荐它,而是分别为他们自己。 – TravisO 2013-09-13 18:58:06

5

我相信you can't

的默认值必须是常量;它不能是一个功能或表达式

16

如前所述你不能。

如果要模拟这种行为,你可以用这种方式使用触发器:

CREATE TRIGGER before_insert_app_users 
BEFORE INSERT ON app_users 
FOR EACH ROW 
    IF new.uuid IS NULL 
    THEN 
    SET new.uuid = uuid(); 
    END IF; 

你还是要更新先前存在的行,像这样:

UPDATE app_users SET uuid = (SELECT uuid()); 
相关问题