1

我正在尝试为 UUID 类型字段设置默认值

/**
 * @var int
 *
 * @ORM\Column(name="uuid", type="guid", options={"default"="uuid_generate_v4()"})
 * @ORM\Id()
 * @ORM\GeneratedValue(strategy="UUID")
 */
private $uuid;

然而,这集执行

ALTER TABLE store ALTER uuid SET DEFAULT 'uuid_generate_v4()';

并将其作为文本。如何在教义注释中将 DB 函数定义为默认值?

4

1 回答 1

3

在创建表上,您可以使用此注释

/**
 * @ORM\Column(name="uuid", type="guid", columnDefinition="DEFAULT uuid_generate_v4()", options={"comment"="Column Comment Here"})
 * @ORM\Id()
 * @ORM\GeneratedValue(strategy="UUID")
 */
private $uuid;

ColumnDefinition将内容附加到 DDL参见 Doctrine Documentation

此配置的 SQL 输出是

ALTER TABLE table_name ADD uuid DEFAULT uuid_generate_v4();
COMMENT ON COLUMN table_name.uuid IS 'Column Comment Here';

这些注释对 CHANGE COLUMN 没有任何作用。仅适用于 ADD COLUMN 生成的 SQL。您必须手动重新创建列或更改表。

重要提示: 对于那些在 PostgreSQL 中寻找创建UUID 列类型的人,请记住,您需要启用一些扩展才能使用创建 uuid-hash 的函数。

在示例中,uuid_generate_v4()派生自UUID-OSSP,旧版本的 PostgreSQL 不支持它。取而代之的是 UUID-OSSP,您可以使用PGCRYPTO 的gen_random_uuid ()函数。UUID 结果是相同的版本(v4)。同样,旧版本不支持它。

请记住使用Create Extension安装扩展。

CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; // OR
CREATE EXTENSION IF NOT EXISTS "pgcrypto";

另一个重要提示:在某些 PostgreSQL 安装(如 CentOS)中,默认情况下不包含扩展。您必须安装它们。

对于 CentOS/RHEL,您需要安装postgresql-contrib。注意你的 PostgreSQL 的版本。即对于 9.5 版,您必须使用postgresql95-contrib

我的权限很弱

有一个技巧可以创建没有扩展的 uuid 哈希。只需使用上面的说明。

uuid_in(md5(random()::text || clock_timestamp()::text)::cstring);

如果您的版本支持 ::UUID 转换,请使用

md5(random()::text || clock_timestamp()::text)::uuid
于 2018-02-20T00:44:24.650 回答