phpMyAdmin:如何插入具有受限列的行?

Posted

技术标签:

【中文标题】phpMyAdmin:如何插入具有受限列的行?【英文标题】:phpMyAdmin: How to insert rows with restricted columns? 【发布时间】:2021-11-20 05:13:04 【问题描述】:

我有一个带有自动递增 ID、colA 和 colB(设置默认值)的表,例如:

CREATE TABLE `some_db`.`test` ( `id` INT NOT NULL AUTO_INCREMENT , `colA` INT NOT NULL , `colB` INT NOT NULL DEFAULT '0' , PRIMARY KEY (`id`)) ENGINE = InnoDB;

现在,我希望用户能够插入新行,但同时不允许修改id(自动递增)或colB(仅使用默认值)。

这可能吗?

我试图只为 colA 提供 INSERT 和 UPDATE,但这仍然给我 INSERT command denied 错误:

GRANT SELECT, INSERT (`colA`), UPDATE (`colA`) ON `some_db`.`test` TO 'test_user'@'%';

我不知道这是否重要,我正在使用 MariaDB。

谢谢!

编辑: 好的,我现在需要重新陈述我的问题。

执行后例如:

INSERT INTO `test` (`colA`) VALUES (10)

一切正常。 但是 phpmyadmin GUI(我在这里用作前端)正在转换为:

INSERT INTO `test` (`id`, `colA`, `colB`) VALUES (NULL, 10, ``)

...当没有给出值,并且无法执行时(#1143 - INSERT 命令拒绝用户test_user@...

那么,有没有什么方法可以通过 phpmyadmin GUI(不是 SQL 命令)插入行,但有这样的限制?(我编辑了问题标题)。

【问题讨论】:

错误是什么? 但是phpmyadmin GUI(我在这里用作前端)正在转换为不要使用它,有什么问题?使用任何其他客户端。 PS。如果程序没有按照你说的做,而是按照它想出的那样做 - 不要使用这样的程序。 【参考方案1】:
CREATE TABLE `test` ( `id` INT NOT NULL AUTO_INCREMENT , 
                      `colA` INT NOT NULL , 
                      `colB` INT NOT NULL DEFAULT '0' , 
                      PRIMARY KEY (`id`)) ENGINE = InnoDB;
CREATE TRIGGER tr_bi_test
BEFORE INSERT
ON test
FOR EACH ROW
SET NEW.id = NULL, NEW.colB = 0;
INSERT INTO test (colA) VALUES (11);
INSERT INTO test (colA, colB) VALUES (22, 222);
INSERT INTO test (id, colA) VALUES (3333, 33);
INSERT INTO test (id, colA, colB) VALUES (4444,44,444);
SELECT * FROM test;
id colA colB
1 11 0
2 22 0
3 33 0
4 44 0

db小提琴here


您不能使用 DEFAULT 关键字将值分配给 NEW.colB - 在 MariaDB 中,在触发器中使用时它被视为 NULL。所以你需要硬编码这个默认值,或者你可以从INFORMATION_SCHEMA.COLUMNS查询。

【讨论】:

有趣。感谢您的努力和看看!请看一下上面的编辑:实际上它正在工作,问题在于 phpMyAdmin @Art 我不使用 phpmyadmin。我也不建议你。 是的,我知道,问题是到目前为止我还没有找到任何简单、免费、易于使用和设置的 GUI 客户端,它允许下拉选择引用键(而不是提供数字IDs) 和 phpMyAdmin 做得很好。我知道这是一件愚蠢的事情,但这就是我现在需要的。

以上是关于phpMyAdmin:如何插入具有受限列的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Datagrip 插入带有标识列的行?

如何排除具有相似列的行?

如何在django中删除具有重复列的行

SQL BigQuery - 插入具有不同日期范围的行

SQL - 如何选择具有最大值列的行

如何获得具有最大值的列的行? [复制]