ฉันมีแบบฟอร์มบนเว็บไซต์ที่มีฟิลด์ต่าง ๆ มากมาย ฟิลด์บางฟิลด์เป็นทางเลือกในขณะที่บางฟิลด์บังคับ ในฐานข้อมูลของฉันฉันมีตารางที่เก็บค่าเหล่านี้ทั้งหมดเป็นวิธีที่ดีกว่าหรือไม่ในการแทรกค่า NULL หรือสตริงว่างลงในคอลัมน์ DB ที่ผู้ใช้ไม่ได้ใส่ข้อมูลใด ๆ
ฉันมีแบบฟอร์มบนเว็บไซต์ที่มีฟิลด์ต่าง ๆ มากมาย ฟิลด์บางฟิลด์เป็นทางเลือกในขณะที่บางฟิลด์บังคับ ในฐานข้อมูลของฉันฉันมีตารางที่เก็บค่าเหล่านี้ทั้งหมดเป็นวิธีที่ดีกว่าหรือไม่ในการแทรกค่า NULL หรือสตริงว่างลงในคอลัมน์ DB ที่ผู้ใช้ไม่ได้ใส่ข้อมูลใด ๆ
คำตอบ:
โดยใช้NULL
คุณสามารถแยกความแตกต่างระหว่าง "ใส่ข้อมูล" และ "ใส่ข้อมูลที่ว่างเปล่า"
ความแตกต่างบางอย่างเพิ่มเติม:
LENGTH
ของNULL
เป็นNULL
เป็นของสตริงที่ว่างเปล่าเป็นLENGTH
0
NULL
s จะถูกจัดเรียงก่อนสตริงว่าง
COUNT(message)
จะนับสตริงว่าง แต่ไม่ใช่NULL
s
คุณสามารถค้นหาสตริงที่ว่างเปล่าใช้ตัวแปรที่ถูกผูกไว้ NULL
แต่ไม่ได้สำหรับ แบบสอบถามนี้:
SELECT *
FROM mytable
WHERE mytext = ?
จะไม่ตรงกับNULL
ในmytext
สิ่งที่คุ้มค่าที่คุณส่งผ่านจากลูกค้า ในการจับคู่NULL
คุณจะต้องใช้ข้อความค้นหาอื่น ๆ :
SELECT *
FROM mytable
WHERE mytext IS NULL
สิ่งหนึ่งที่จะต้องพิจารณาถ้าคุณเคยวางแผนที่จะเปลี่ยนฐานข้อมูลเป็นที่Oracle ไม่สนับสนุนสตริงที่ว่างเปล่า WHERE somefield = ''
พวกเขาจะถูกแปลงเป็นโมฆะโดยอัตโนมัติและคุณไม่สามารถสอบถามสำหรับพวกเขาโดยใช้คำสั่งเช่น
Steve B.
: ดูคำถามนี้: stackoverflow.com/questions/1171196/…
สิ่งหนึ่งที่ต้องจำไว้คือ NULL อาจทำให้ codepath ของคุณยากขึ้น ในหลามตัวอย่างส่วนใหญ่อะแดปเตอร์ฐานข้อมูล / ORMs แผนที่จะNULL
None
ดังนั้นสิ่งที่ชอบ:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
อาจส่งผลให้ "Hello, None Joe Doe!" หากต้องการหลีกเลี่ยงคุณต้องมีรหัสเช่นนี้:
if databaserow.title:
print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
print "Hello, %(firstname) %(lastname)!" % databaserow
ซึ่งสามารถทำให้สิ่งต่าง ๆ มีความซับซ้อนมากขึ้น
ดีกว่าที่จะแทรกNULL
สำหรับความสอดคล้องในฐานข้อมูลของคุณใน MySQL กุญแจต่างประเทศสามารถเก็บไว้ได้NULL
แต่ไม่ใช่สตริงว่างเปล่า
คุณจะมีปัญหากับสตริงว่างในข้อ จำกัด คุณอาจต้องแทรกระเบียนปลอมด้วยสตริงว่างที่ไม่ซ้ำกันเพื่อตอบสนองข้อ จำกัด Foreign Key การปฏิบัติที่ไม่ดีฉันเดา
ดูเพิ่มเติมที่: foreign key สามารถเป็นค่า NULL และ / หรือทำซ้ำได้หรือไม่?
ฉันไม่ทราบว่าวิธีปฏิบัติที่ดีที่สุดจะอยู่ที่นี่ แต่โดยทั่วไปแล้วฉันมักจะผิดพลาดหากไม่ต้องการให้ null หมายถึงสิ่งที่แตกต่างจากสตริงว่างและการป้อนข้อมูลของผู้ใช้ตรงกับนิยามสตริงว่างเปล่าของคุณ
โปรดทราบว่าฉันกำลังบอกว่าคุณต้องกำหนดว่าคุณต้องการให้พวกเขาแตกต่างกันอย่างไร บางครั้งมันก็สมเหตุสมผลที่จะให้พวกเขาแตกต่างกันบางครั้งก็ทำไม่ได้ ถ้าไม่ใช่ให้เลือกอันใดอันหนึ่งแล้วติดกับมัน อย่างที่ฉันพูดฉันมักจะชอบ NULL เป็นส่วนใหญ่
โอ้และพึงระลึกไว้ว่าหากคอลัมน์นั้นเป็นโมฆะเรคคอร์ดจะมีโอกาสน้อยที่จะปรากฏในคิวรีใด ๆ ที่เลือก (มีส่วนคำสั่งในเงื่อนไข SQL) ที่อยู่นอกคอลัมน์นั้นยกเว้นการเลือกนั้นจะเป็นคอลัมน์ว่าง แน่นอน.
หากคุณใช้หลายคอลัมน์ในดัชนีที่ไม่ซ้ำใครและอย่างน้อยหนึ่งคอลัมน์เหล่านี้จำเป็นต้องมี (เช่นเขตข้อมูลฟอร์มที่จำเป็น) หากคุณตั้งค่าคอลัมน์อื่น ๆ ในดัชนีเป็น NULL คุณอาจสิ้นสุดด้วยแถวที่ซ้ำกัน นั่นเป็นเพราะค่า NULL ถูกละเว้นในคอลัมน์ที่ไม่ซ้ำกัน ในกรณีนี้ใช้สตริงที่ว่างในคอลัมน์อื่น ๆ ของดัชนีที่ไม่ซ้ำกันเพื่อหลีกเลี่ยงแถวที่ซ้ำกัน
คอลัมน์ใน INDEX ที่ไม่ซ้ำใคร: (event_type_id, event_title, วันที่, สถานที่, URL) ตัวอย่าง 1: (1, 'BBQ', '2018-07-27', null, null) (1, 'BBQ', '2018-07-27', null, null) // อนุญาตและทำซ้ำ ตัวอย่าง 2: (1, 'BBQ', '2018-07-27', '', '') (1, 'BBQ', '2018-07-27', '', '') // ไม่ได้รับอนุญาตเนื่องจากมีการทำซ้ำ
นี่คือรหัสบางส่วน:
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`event_id` int(11) DEFAULT NULL,
`event_title` varchar(50) DEFAULT NULL,
`date` date DEFAULT NULL,
`location` varchar(50) DEFAULT NULL,
`url` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ตอนนี้แทรกสิ่งนี้เพื่อดูว่าจะอนุญาตแถวที่ซ้ำกัน:
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);
ตอนนี้แทรกและตรวจสอบว่ามันไม่ได้รับอนุญาต:
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');
ดังนั้นไม่มีถูกหรือผิดที่นี่ ขึ้นอยู่กับคุณตัดสินใจว่าอะไรดีที่สุดกับกฎเกณฑ์ทางธุรกิจของคุณ