• 主键一定会创建一个唯一索引,但是有唯一索引的列不一定是主键;
  • 主键不允许为空值,唯一索引列允许空值;
  • 一个表只能有一个主键,但是可以有多个唯一索引;
  • 主键可以被其他表引用为外键,唯一索引列不可以;
  • 主键是一种约束,而唯一索引是一种索引,是表的冗余数据结构,两者有本质的差别

有一个容器服务无法 stop、rm(docker rm -f)和 kill 等操作,也就是说这个容器服务无法终止

# ll /var/lib/docker/containers | grep caf8ef20f3c1

# cd /var/lib/docker/containers 

# rm -rf caf8ef20f3c1c78f03a5844ee23abc1d7e44246f242292040f1ef288899d0cb8

这个时候我们会收到这样的报错:

rm: 无法删除"/var/lib/docker/containers/caf8ef20f3c1c78f03a5844ee23abc1d7e44246f242292040f1ef288899d0cb8/secrets": 设备或资源忙
无法删除"/var/lib/docker/containers/caf8ef20f3c1c78f03a5844ee23abc1d7e44246f242292040f1ef288899d0cb8/shm": 设备或资源忙

(2)从上面报错我们可以看到“secrets”和“shm”共享挂载导致无法删除,首先找到挂载的位置,然后取消挂载后,再删除

# cat /proc/mounts |grep "docker" |grep "caf8ef20f3c1"

(3)取消挂载:

# umount /data/sys/var/docker/containers/caf8ef20f3c1c78f03a5844ee23abc1d7e44246f242292040f1ef288899d0cb8/secrets

# umount /data/sys/var/docker/containers/caf8ef20f3c1c78f03a5844ee23abc1d7e44246f242292040f1ef288899d0cb8/shm

(4)再次查看:

# cat /proc/mounts |grep "docker" |grep "caf8ef20f3c1"  //已经没有啦

(5)现在执行删除docker的目录:

# cd /var/lib/docker/containers 

# rm -rf caf8ef20f3c1c78f03a5844ee23abc1d7e44246f242292040f1ef288899d0cb8

(6)删除容器服务

现在我们使用 rm 或 kill 来删除 容器服务:

# docker rm -f caf8ef20f3c1c
或
# docker kill --signal=SIGINT  caf8ef20f3c1

解决方案来源

开发中经常碰到需要拼接数据的情况,例如元数据

{
    "order":[
        {
            "orderNo":"1234567899975554444",
            "userId":"12",
            "productId":"200"
        },
        {
            "orderNo":"1234567899975554445",
            "userId":"13",
            "productId":"300"
        }
    ],
    "user":[
        {
            "id":"12",
            "name":"timi",
            "phone":"1333333333"
        },
        {
            "id":"13",
            "name":"timi2",
            "phone":"1333333333"
        }
    ],
    "product":[
        {
            "id":"200",
            "name":"name",
            "imageId":"1"
        },
        {
            "id":"300",
            "name":"name",
            "imageId":"1"
        }
    ],
    "image":[
        {
            "id":"1",
            "url":"/aa/bb.jpg"
        },
        {
            "id":"2",
            "url":"/cc/dd.jpg"
        }
    ]
}

一般需要拼接成

{
    "order":[
        {
            "orderNo":"1234567899975554444",
            "userName":"timi",
            "userPhone":"1333333333",
            "productName":"name",
            "imageUrl":"/aa/bb.jpg"
        }
    ]
}

一般都是需要写代码实现,而且中间还有数据字段需要隐藏或者转换,最近实现了一套规则,减少类似的代码书写,提升工作效率,全部使用规则实现数据的输出,找个时间整理一下开源出来

{
    "order|rangeArray":[
        {
            "orderNo":"$(order.[#].orderNo)",
            "userName":"$(order.[#].userId)|$(user.#(id=="$(variable)").name)",
            "userPhone":"$(order.[#].userId)|$(user.#(id=="$(variable)"). phone)",
            "productName":"$(order.[#].productId)|$(product.#(id=="$(variable)").name)",
            "imageUrl":"$(order. productId)|$(product.#(id=="$(variable)").imageId)|$(image.#(id=="$(variable)").url)"
        }
    ]
}

var testArray = []int{1, 8, 6, 9, 10, 15, 12, 20}
testArrayLen := len(testArray)
minNum := testArray[testArrayLen-1]
maxNum := testArray[0]
minArray := make([]int, testArrayLen)
for i := testArrayLen - 1; i >= 0; i-- {
    if testArray[i] < minNum {
        minNum = testArray[i]
    }
    minArray[i] = minNum
}

for i := 0; i < testArrayLen-1; i++ {
    if testArray[i] > maxNum {
        maxNum = testArray[i]
        if testArray[i] < minArray[i+1] {
            fmt.Println(i)
        }
    }
}