在没有给出列名和值的情况下运行 INSERT INTO 语句时 MySQL 返回什么?

糟糕,2 02 2 年,那个小镇上有一个程序员兄弟,他写了一条 INSERT INTO 语句,但没有写列名和值。
他认为无论如何表中都允许 NULL,所以他尝试了一下。
结果,MySQL 人非常有信心,确实将每一列都填充为 NULL。

小弟当时并没有太在意。
然而,表中的列没有约束和默认值,因此它们只是随机填充。
检查完结果,嘿,果然,都是NULL,干净得像白纸一样。

但是后来,弟弟发现了一个问题。
如果表中有字段,则不允许为NULL,或者不设置默认值。
如果你再这样做,MySQL会不高兴,会直接报错,说“这个字段没有默认值,你不能这样填充它”。

这可麻烦了。
数据完整性是一件大事。
如果你不小心填写了NULL,后续的查询或应用程序逻辑可能会完全混乱。

所以我弟弟后来吸取了教训。
每当我插入数据时,我都会显式指定列名称和值。
这样既安全又放心。
毕竟,没有人愿意因为一个小小的疏忽而弄乱他们的整个数据库。

面试官:MySQL 给数据表增加一列,一定会锁表吗?

MySQL5 .6 +增加了没有锁定表的列,MySQL8 .0+更加优化。
应评估大量数据或复杂操作,并测试非高峰时段的操作。

MySQL表中如何增加列mysql表增加列

说实话,我得从我当DBA时的经历来说说。
确实,添加列的操作分为两件事,各有各的要求。

首先让我们添加新表的列。
这确实是一种很常见的做法,尤其是在古人中。
您可以根据需要排列所有列。
当我在为用户表构建一个电子商务系统时,我决定一口气包含十多个列,包括用户、密码、电话号码、电子邮件、注册时间和上次登录时间。
所有这些都是主要领域所需要的。
当时我在写SQL语句的时候,在IDE里直接输入:
sql 用户表( user_id INT 自动递增主键 用户 VARCHAR(5 0) NOT NULL, 密码 VARCHAR(2 5 5 ) NOT NULL; 电话 VARCHAR(2 0); 地址 VARCHAR(1 00); 创建时间 TIMESTAMP 默认 CURRENT_TIMESTAMP ); 这种方法的优点是结构清晰,立即创建完美的表格。
但缺点是如果发现中间少了一个字段,突然加了“类型”,就得重画表,而且数据迁移也很麻烦。
我曾经遇到过一个流量方请求临时用户级别的情况。
结果我被迫重建了所有的用户记录,并且拿走了三天的数据。

让我们向现有表添加列。
这简直就是一个DBA的日常,尤其是系统上线之后。
我记得想要添加一个活动指示器“用户活动”,并向用户表添加一个字段点。
直接使用ALTER TABLE即可:
sql ALTER TABLE 用户 DDD COLUMN active_score DECIMAL(3 ,2 ) DEFAULT 0.0;
这个方法的灵活性真的很灵活,你可以根据需要添加更多。
但有一个警告必须注意,尤其是对于大型手表。
之前我托管了一个千万级用户的表,我的一个兄弟坚持要我加一个全文索引字段。
结果,ALTER TABLE 数据库关闭了五个小时。
后来查资料发现自己用的是在线DDL或者批处理。
因此,在操作一个大的现有表之前,需要评估其影响。
我有一个大哥不注意,又加了一个字段,所以网上作业进行了很久,有效。
这两种方法都有其缺陷。
向新表添加列比较省心,但不够灵活;向现有表添加列很灵活,但可能会导致性能问题。
说实话,现在很多新系统都在使用NoSQL。
列的增删改查很灵活,但基本的数据库关系技能仍有待掌握。