Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL数据库唯一列名_Php_Mysql - Fatal编程技术网

Php MySQL数据库唯一列名

Php MySQL数据库唯一列名,php,mysql,Php,Mysql,我为自己编写了一个PHP脚本,帮助管理一个由10名成员组成的小组。此脚本当前连接到数据库,并每周更新任何级别和电源更改。然而,我想扩展它,在一个新的表中,将获得的所有功率保存在一个单独的列中,而不是全部相加 我能想到的唯一方法是使用下面的代码创建列并更改每个列的名称 ALTER TABLE `power gained` ADD timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER name;

我为自己编写了一个PHP脚本,帮助管理一个由10名成员组成的小组。此脚本当前连接到数据库,并每周更新任何级别和电源更改。然而,我想扩展它,在一个新的表中,将获得的所有功率保存在一个单独的列中,而不是全部相加

我能想到的唯一方法是使用下面的代码创建列并更改每个列的名称

ALTER TABLE `power gained` ADD timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER name;
所以我的问题是,我是否可以创建列以确保其名称是唯一的,或者是否可以将列名设置为时间戳以保存列

我还想澄清一下,我使用的是mysql函数,因为它在我的本地系统上,不易受到攻击,我也不会愚蠢到犯错误。

使用规范化。

将用户和电源拆分为两个不同的表

CREATE TABLE `users_power` (
  `user_id` smallint(5) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `total_power` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

CREATE TABLE `power` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` smallint(1) NOT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `power_increase` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

DROP TRIGGER IF EXISTS `Update users_power`;

CREATE TRIGGER `Update users_power` AFTER INSERT ON `power` FOR EACH ROW BEGIN
    UPDATE `users_power` AS `UP`
    SET `UP`.`total_power` = `UP`.`total_power` + NEW.`power_increase`
    WHERE `UP`.`user_id` = NEW.`user_id`;
END
然后向上看,做一些类似的事情

SELECT `power` AS total_power
FROM users_power
WHERE users_power.`user_id` = 1
select * from power where user_id = 1;
+----+---------+---------------------+----------------+
| id | user_id | time                | power_increase |
+----+---------+---------------------+----------------+
|  1 |       1 | 2014-08-7 17:04:06  |              5 |
|  2 |       1 | 2014-08-15 17:04:31 |             15 |
+----+---------+---------------------+----------------+
2 rows in set

select * from users_power where user_id = 1;
+---------+------+-------------+
| user_id | name | total_power |
+---------+------+-------------+
|       1 | joe  |          21 |
+---------+------+-------------+
1 row in set
你的结构看起来像

SELECT `power` AS total_power
FROM users_power
WHERE users_power.`user_id` = 1
select * from power where user_id = 1;
+----+---------+---------------------+----------------+
| id | user_id | time                | power_increase |
+----+---------+---------------------+----------------+
|  1 |       1 | 2014-08-7 17:04:06  |              5 |
|  2 |       1 | 2014-08-15 17:04:31 |             15 |
+----+---------+---------------------+----------------+
2 rows in set

select * from users_power where user_id = 1;
+---------+------+-------------+
| user_id | name | total_power |
+---------+------+-------------+
|       1 | joe  |          21 |
+---------+------+-------------+
1 row in set
编辑
  • 添加了在将记录插入电源时自动更新总电源的触发器

    • 我还没有测试过这一点,但我想我已经找到了一种方法,可以用我理解的方式来做这件事(这是最重要的部分)


      我不想从数据库中提取数据,因为我只需转到localhost/phpmyadmin就可以访问它,而且我永远不需要提取它。

      no。您不需要创建更多列来存储“相同但在不同时间”的数据。您创建一个子表,并将您的时间/值/用户标识存储在其中。1。请参见标准化。不,您将得到一张表。使用您的方法,您将得到大量的列,其中大部分总是空的,并且具有真正愚蠢的名称,如
      2014-08-15 09:23:13
      。如果每次需要查找某些内容时都不必解析表结构,您将如何找到这些列名?通过一个子表,您可以从powerups中选择sum(power),其中userID=Foo和timestamp介于'2014-06-01'和'2014-06-30'。我不需要知道您在做什么,就知道这不是一个好主意。尽管去做你想做的,但是当支持或扩展它变成一场噩梦时,不要回来抱怨。@Spedwards-你真的应该听MarcB的建议,任何其他方法都是愚蠢的。您只需要一个子表,带有userid和powergaund,然后您只需像user 1获得5一样填充它,然后您就可以在主表中对它们求和,直到添加一个额外的列,这是一种非常糟糕的方式。如果将来你想提取它呢?这种方法不是未来的证明。@hd。我仍然可以很容易地提取这个。。。列名只是每个星期五的日期。所以
      2014-08-08
      2014-08-15
      2014-08-22
      等等。