phpmyadmin mySQL创建值为“的列”;作为「;没有发生

phpmyadmin mySQL创建值为“的列”;作为「;没有发生,mysql,phpmyadmin,Mysql,Phpmyadmin,需要: 在IP_n中输入整数IP值,并使用mysql的内部INET_NTOA()函数填充IP_a列。但是使用phpMyAdmin,我甚至无法正确创建表。 我这样做: 但这是错误的:对于IP:192.168.1.1 第二栏是: 灵感来自这里:您正试图根据另一列的内容为一列声明默认值 不幸的是,您不能这样做。®该列的默认值似乎是字符串文字。分配字符串文字非常有效,在本例中,'INET\u NTOA(ip\u n)。这看起来像是对MySQL函数的引用,但MySQL将其视为文本 如果我们运行一个I

需要: 在IP_n中输入整数IP值,并使用mysql的内部INET_NTOA()函数填充IP_a列。但是使用phpMyAdmin,我甚至无法正确创建表。 我这样做:

但这是错误的:对于IP:192.168.1.1

第二栏是:


灵感来自这里:

您正试图根据另一列的内容为一列声明默认值


不幸的是,您不能这样做。®

该列的默认值似乎是字符串文字。分配字符串文字非常有效,在本例中,
'INET\u NTOA(ip\u n)
。这看起来像是对MySQL函数的引用,但MySQL将其视为文本

如果我们运行一个INSERT语句并允许MySQL分配默认值,那么我们希望在列中存储确切的文本;这正是我们希望在SELECT中返回的内容

(OP观察到的行为)

请注意,MySQL只允许将文本值指定为VARCHAR列的
默认值。事实上,这适用于所有数据类型,时间戳除外,它允许将当前的时间戳作为默认值。(最近的版本也支持类似类型的DATETIME默认值。)但对于VARCHAR列,默认值是
NULL
或一个文本


要获得自动分配给列的值,可以使用MySQL BEFORE INSERT触发器(和BEFORE UPDATE触发器)

也许是这样的:

DELIMITER $$

CREATE TRIGGER mytable_bi 
BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
  SET NEW.ip_a = INET_NTOA(NEW.ip_n);
END$$

DELIMITER ;

如果希望保持值“同步”,则在更新语句更改
ip\n
的值时,需要相应的更新前触发器。

:“
DEFAULT
子句指定列的默认值。[有一个例外,]默认值必须是常量;它不能是函数或表达式。”(例外情况是时间戳或日期时间列的当前时间戳。)因此,您在此处指定为默认值的只是文本
INET\u NTOA(ip\u n)
,字面意思是。pl查看问题中引用的链接,这位先生能够做到这一点。怎么做???你考虑过触发器吗?这篇文章讨论的是MariaDB中的一个功能,而不是MySQL。@CBroe将此作为答案。持久虚拟列仅适用于MariaDB。哦,好的。那么这是如何发生的呢?:mysql>创建表
iptest
ip\u n
int(11)无符号非空,
ip\u a
CHAR(15)AS(INET\u NTOA(
ip\u n
))持久主键(
ip\u n
),键
ip\u a
ip\u a
)+1.VARCHAR列只允许默认值为NULL或字符串文字。OP描述的行为正是我们所期望的。目标是根据内部函数从ip_n列中计算出值。那么怎么做呢?使用MySQL,您可以创建在插入之前和更新之前为列赋值的触发器。或者,使用MySQL以外的数据库(例如MariaDB)支持虚拟列。