原先可行的建磁區表方法:
劣勢:必須要把created_at作為主鍵之一
ALTER TABLE files PARTITION BY RANGE
(UNIX_TIMESTAMP(created_at))
(PARTITION {$pname} VALUES LESS THAN ({$less_than_time}))
我現在想按照ID中隱藏的時間戳來做條件
我現在把一部分時間戳放到了ID中,比如現在的ID是9777215210102229301,
其中9777215是時間的一部分,它是1509777215截斷前面3位得到的,當我入庫的時候,我希望通過拼接當前時間來存入對應磁區,于是我嘗試如下操作:
selct CONVERT(CONCAT(left(unix_timestamp(now()),3), left('9777215210102229301',7)),SIGNED)發現 沒問題,可以得到正確的時間戳,但我把它替換到磁區表構建陳述句中就報錯了
替換陳述句
ALTER TABLE files PARTITION BY
RANGE(CONVERT(CONCAT(left(unix_timestamp(now()),3), left(id,7)),SIGNED))
(PARTITION {$pname} VALUES LESS THAN ({$less_than_time}))
報錯:
```
ERROR 1064 (42000): Constant, random or timezone-dependent expressions in (sub)
partitioning function are not allowed near ')
(PARTITION '2017' VALUES LESS THAN (150981119))' at line 1
```
這樣也不行
ALTER TABLE files PARTITION BY
RANGE(
UNIX_TIMESTAMP(FROM_UNIXTIME(
CONCAT(left(unix_timestamp(now()),3), left('9777215210102229301',7)))
)
)
(PARTITION '2017' VALUES LESS THAN 150981119)
大神們可否幫助解決
uj5u.com熱心網友回復:
CONVERT(CONCAT(left(unix_timestamp(now()),3), left('9777215210102229301',7)),SIGNED)------ 對于磁區來說,這個運算式很明顯是一個有問題的東東,當前所處的時間不同,計算的結果就可能不同, 但磁區顯然是要求一個確定的結果
不然對于同一個 ID, 今天算出來是處于磁區1, 明天算出來應該在磁區2,你覺得這個還有意思么?
uj5u.com熱心網友回復:
mysql里磁區時,是可以對欄位進行計算,但是你用now這個函式,顯然每天的值都是不一樣的,在報錯資訊里也說了,依賴于時間的這種計算時不能有的。uj5u.com熱心網友回復:
我覺得是否可以新增一個欄位,把你計算出來的值放到這個新欄位里,然后再磁區呢轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/106478.html
標籤:MySQL
