เพิ่มคอลัมน์การประทับเวลาด้วยค่าเริ่มต้น NOW () สำหรับแถวใหม่เท่านั้น


113

ฉันมีโต๊ะที่มีหลายพันแถว เนื่องจากตารางไม่ได้สร้างด้วยคอลัมน์ created_at ในตอนแรกจึงไม่มีวิธีรับการประทับเวลาการสร้าง เป็นสิ่งสำคัญแม้ว่าจะต้องเริ่มรับการประทับเวลาสำหรับแถวในอนาคต

มีวิธีใดบ้างที่ฉันสามารถเพิ่มคอลัมน์การประทับเวลาด้วยค่าเริ่มต้น NOW () เพื่อที่จะไม่เติมค่าในแถวก่อนหน้า แต่สำหรับแถวในอนาคตเท่านั้น

ถ้าฉันทำALTERแบบสอบถามมันจะเติมข้อมูลทุกแถวด้วยการประทับเวลา:

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

คำตอบ:


159

คุณต้องเพิ่มคอลัมน์ที่มีค่าเริ่มต้นของแล้วเปลี่ยนคอลัมน์ที่จะมีการเริ่มต้นnullnow()

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP;
ALTER TABLE mytable ALTER COLUMN created_at SET DEFAULT now();

43

คุณสามารถเพิ่มกฎเริ่มต้นด้วยตารางแก้ไข

ALTER TABLE mytable ADD COLUMN created_at TIMESTAMP DEFAULT NOW()

จากนั้นตั้งค่าเป็นโมฆะทุกแถวที่มีอยู่ในปัจจุบันทันที:

UPDATE mytable SET created_at = NULL

จากนั้นจุดนี้DEFAULTจะมีผล


โดยหลักการแล้วเป็นเรื่องดีแม้ว่าจะมีน้ำหนักในการอัปเดตซึ่งอาจทำให้ทริกเกอร์เริ่มทำงานได้
Philip Couling

8
@ Artur: วิธีแก้ปัญหาที่ฟิลิปนำเสนอคือหนทางที่จะไป UPDATEไม่จำเป็น. ถ้าคุณเพิ่มเริ่มต้นคอลัมน์ไปยังมีอยู่คอลัมน์แถวที่มีอยู่แล้วจะไม่ได้รับผลกระทบ ค่าดีฟอลต์จะถูกเติมก็ต่อเมื่อคุณเพิ่มคอลัมน์และค่าเริ่มต้นในคำสั่งเดียวกัน
Erwin Brandstetter

9

ตัวอย่างเช่นฉันจะสร้างตารางที่เรียกว่าusersด้านล่างและตั้งชื่อคอลัมน์ที่dateเป็นค่าเริ่มต้นNOW()

create table users_parent (
    user_id     varchar(50),
    full_name   varchar(240),
    login_id_1  varchar(50),
    date        timestamp NOT NULL DEFAULT NOW()
);

ขอบคุณ


0

ลองสิ่งที่ชอบ: -

ALTER TABLE table_name ADD  CONSTRAINT [DF_table_name_Created] 
DEFAULT (getdate()) FOR [created_at];

แทนที่table_nameด้วยชื่อตารางของคุณ


1
CONTSTRAINT มีประโยชน์อย่างไร?
rubo77
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.