与bigint字段一起使用以形成复合键或唯一索引时,datetime字段的精度是否会更改?

时间:2016-09-22 13:22:31

标签: sql sql-server datetime composite-primary-key

我需要使用由bigint数据类型和日期时间数据类型组成的复合键或唯一索引。但是,我注意到日期时间的秒元素已四舍五入到最接近的分钟,并在尝试导入数据集时导致重复的密钥违规。

数据集本质上是事务性数据,因此我们的ID(存储在bigint字段中)将被重复,因此需要在唯一键中包含datetime字段。

举一个例子:以下两行会导致一个重复的键行'错误:

ID字段(bigint)| ActionDate(日期时间)
--------------------- | --------------------------
1050000284002 | 2016-01-08 15:51:24.000
1050000284002 | 2016-01-08 15:50:35.000

值明显不同(并且正确存储在数据库中),但错误显示:

The duplicate key value is (1050000284002, Jan  8 2016  3:51PM).

(值得补充的是,我最初创建了一个复合键,然后用一个唯一索引替换它;上面列出的错误是在索引到位的情况下生成的。)

我的问题是:

  1. 我的日期时间字段是否被舍入,因为我在键/索引中使用了一个整数?
  2. 还有另一个原因导致我失去日期时间字段的时间成分的准确性吗?
  3. 如何纠正问题,以便示例不会导致密钥违规?

2 个答案:

答案 0 :(得分:1)

如果您正在使用表单的索引(列A,B上的索引)而不是公式索引(列A + B上的索引),那么不,一列的数据类型对内容没有影响另一个。

根据您的描述,我会检查以下内容:

  • datetime列的实际数据类型。是datetime吗? (日期时间将四舍五入到最接近的333秒,但这不是问题所在。)
  • 索引的实际定义。定义为您认为它是否已定义?也许是日期索引(DateTimeColumn)?
  • 存储的实际数据。无论是将数据加载到表中还是截断秒数?

基于您的修改的进一步建议:

如果您要导入的数据明确包含唯一的日期时间值,但SQL未识别唯一的日期值,那么数据导入过程就会出现问题。

尝试将您的数据加载到表中,而不使用索引。它加载吗?它是否与您的源数据匹配到毫秒?现在,在加载数据的情况下,创建索引(主键,唯一约束,等等)。这会失败吗?重复数据来自哪里?简而言之,搞乱数据和加载过程,看看有什么不妥。

答案 1 :(得分:0)

当我这样做时:

#!/bin/bash
#
# chkconfig: 3 80 20
# description: boop-logstash-forwarder
#
# Get function from functions library
. /etc/init.d/functions
# Start the service

LOGSTASH_FORWARDER="/logiciels/logstash-forwarder/logstash-forwarder"
LF_CONF="/appli/projects/BOOP-LOGSTASH-FORWARDER/logstash-forwarder.conf"
SERVICE_NAME="boop-logstash-forwarder"

start() {
        initlog -c "echo -n Starting $SERVICE_NAME: "
        $LOGSTASH_FORWARDER -config=$LF_CONF &
        ### Create the lock file ###
        touch /var/lock/subsys/$SERVICE_NAME
        success $"$SERVICE_NAME startup"
        echo
}
# Restart the service
stop() {
        initlog -c "echo -n Stopping $SERVICE_NAME: "
        killproc $SERVICE_NAME
        ### Now, delete the lock file ###
        rm -f /var/lock/subsys/$SERVICE_NAME
        echo
}
### main logic ###
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status $SERVICE_NAME
        ;;
  restart|reload|condrestart)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac
exit 0

我得到: 2016-10-17 09:47:05.753

Stopping looping-logstash-forwarder:                       [FAILED]

请注意,第一个结果是日期加25天。所以日期的整数部分没有下降(否则它将是日期的午夜......)。

第二个选择会丢弃小数点后的所有内容....