mysql 在数据库中设置时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 在数据库中设置时间相关的知识,希望对你有一定的参考价值。

CREATE TABLE blogentries
(
blog_id INT (100) PRIMARY KEY,
author_id INT REFERENCES author (author_id),
title TEXT NOT NULL,
description TEXT,
TYPE NVARCHAR(10) NOT NULL,
allowcomment CHAR(1) NOT NULL,
markprivate CHAR(1) NOT NULL,
body TEXT NOT NULL,
datecreated DATETIME DEFAULT ( NOW()),(报错!!!!!)
datepublish DATETIME DEFAULT (NOW()),
datemodified DATETIME DEFAULT (NOW()),

)

1、非要用datetime的话就不能用default而要通过trigger来实现
2、在插入时value用now()函数、或者自行取运行时间
3、字段类型改变为:
datecreated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
datemodified timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
但是其实不可行,因为一个表只能有一个CURRENT_TIMESTAMP,但你有三个字段。

所以当有多个时间可能还是得结合方式2与方式3来综合处理。当然全都用方式2也就不会提出这种问题了。
参考技术A 在创建表的时候是不支持函数的,而且datetime本身是不支持默认是now()的,必须使用timestamp这个类型,如下:
CREATE TABLE blogentries
(
blog_id INT (100) PRIMARY KEY,
author_id INT REFERENCES author (author_id),
title TEXT NOT NULL,
description TEXT,
TYPE NVARCHAR(10) NOT NULL,
allowcomment CHAR(1) NOT NULL,
markprivate CHAR(1) NOT NULL,
body TEXT NOT NULL,
datecreated TIMESTAMP ,
datepublish TIMESTAMP ,
datemodified TIMESTAMP defAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

)
defAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP就是插入时默认当前时间,更新时更新为当前时间。另外有一个问题就是mysql目前一个表只支持一个字段有默认当前时间,所以说你的datecreated和datepublish需要在插入函数中处理,例如
insert blogentries(blog_id,title,datecreated) values(1, 'help me', now());
同理,发表时间也可以用同样的方式插入。
参考技术B 在创建表的时候是不支持函数的,而且datetime本身是不支持默认是now()的,必须使用timestamp这个类型,如下:
CREATE TABLE blogentries
(
blog_id INT (100) PRIMARY KEY,
author_id INT REFERENCES author (author_id),
title TEXT NOT NULL,
description TEXT,
TYPE NVARCHAR(10) NOT NULL,
allowcomment CHAR(1) NOT NULL,
markprivate CHAR(1) NOT NULL,
body TEXT NOT NULL,
datecreated TIMESTAMP ,
datepublish TIMESTAMP ,
datemodified TIMESTAMP defAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

)
defAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP就是插入时默认当前时间,更新时更新为当前时间。另外有一个问题就是Mysql目前一个表只支持一个字段有默认当前时间,所以说你的datecreated和datepublish需要在插入函数中处理,例如
insert blogentries(blog_id,title,datecreated) values(1, 'help me', now());
同理,发表时间也可以用同样的方式插入。
希望能够帮助你。本回答被提问者采纳

在 SELECT 语句中设置变量 - MySQL

【中文标题】在 SELECT 语句中设置变量 - MySQL【英文标题】:SET a variable in SELECT statement - MySQL 【发布时间】:2013-03-12 22:32:13 【问题描述】:

我正在使用这个有错误的代码:

SET @rejects = '';

SELECT *
FROM list
WHERE maker = 1
    AND by_ids IN ('10','11')
    AND country LIKE '%I%'
    AND (
        src IS NULL
        || src NOT IN (@rejects)
        AND checkSrc(src) = 'yes'
        AND SET @rejects = CONCAT(@rejects,',',src)
    );

导致问题的原因是什么?

【问题讨论】:

可能是by_ids INT('10','11')by_ids IN('10','11') 为什么 AND SET @rejects = CONCAT(@rejects,',',src)WHERE 子句中? 这就是我想要的,我想将每个搜索到的 src 的值连接到 @rejects 变量中。 ||不应用作或。 您可以在搜索“MySQL group by best/top n”或类似内容时看到示例 - 这是因为 MySQL 解决方案需要一些有趣的技巧(通常只是增加一个计数器)。 【参考方案1】:

那么你可以这样写你的查询。

SET @rejects = '';
SELECT @rejects = CONCAT(@rejects,',',src) FROM list WHERE maker = 1 AND by_ids IN ('10','11') AND country LIKE '%I%' AND 
(src IS NULL OR src NOT IN (@rejects) AND checkSrc(src) = 'yes');
SELECT @rejects;

【讨论】:

您的预期输出是什么?此外,如果 src 为空,则可能存在问题。你能发布你的表结构和预期的输出吗?【参考方案2】:

问题是你不能在一个语句中混合selectset,肯定会出现语法错误:

select*from t where 1 and set@a=1;

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“set@a=1”附近使用正确的语法

如果您想在select 中执行set,请使用the colon equals 语法。改变这个:

select*from t where 1 and set@a=1;

进入:

select*,@a:=1 from t where 1;

以下是您在每一行上更新变量的方法:

create table t(id int); insert t values(1),(2),(3);
set@a=0;
select@a:=id from t;
+--------+
| @a:=id |
+--------+
|      1 |
|      2 |
|      3 |
+--------+

你甚至可以concat:

set@a='0';
select @a:=concat(@a,',',id)from t;
+-----------------------+
| @a:=concat(@a,',',id) |
+-----------------------+
| 0,1                   |
| 0,1,2                 |
| 0,1,2,3               |
+-----------------------+

concat 不带前导0

set@a='';
select @a:=concat(@a,if(@a='','',','),id)from t;
+------------------------------------+
| @a:=concat(@a,if(@a='','',','),id) |
+------------------------------------+
| 1                                  |
| 1,2                                |
| 1,2,3                              |
+------------------------------------+

但是,手册明确指出这是危险的:

...您应该从不为用户变量赋值并读取 同一语句中的值...

...你可能会得到你期望的结果,但这是 不是 保证

...涉及用户变量的表达式的求值顺序是 未定义

on Xaprb 也提到了这一点。

最后,如果您正在做古怪的事情,例如为变量分配不同的值类型等,checkout the manual 以确保您了解复杂的机制。

【讨论】:

"...您永远不应该为用户变量赋值并在同一语句中读取该值..." 这为我节省了大量的试验和-错误。

以上是关于mysql 在数据库中设置时间的主要内容,如果未能解决你的问题,请参考以下文章

创建数据库时是不是需要在 MySQL 中设置 DEFAULT CHARSET?

如何在 IBM Worklight 中设置 MySQL

Mysql中设置默认时间为系统当前时间

hibernate - 如何在 mysql 和 oracle 数据库中设置自动增量?

如何在存储过程 MySql 中设置默认时区

如何使用 Django 2.* mysqlclient 在 MySQL 数据库中设置排序规则?