diff --git a/aodh/api/controllers/v2/alarms.py b/aodh/api/controllers/v2/alarms.py
index 287f5bfa1..1d1f4d2d5 100644
--- a/aodh/api/controllers/v2/alarms.py
+++ b/aodh/api/controllers/v2/alarms.py
@@ -592,15 +592,6 @@ class AlarmController(rest.RestController):
         else:
             data.state_timestamp = alarm_in.state_timestamp
 
-        # make sure alarms are unique by name per project.
-        if alarm_in.name != data.name:
-            alarms = list(pecan.request.storage.get_alarms(
-                name=data.name, project=data.project_id))
-            if alarms:
-                raise base.ClientSideError(
-                    _("Alarm with name='%s' exists") % data.name,
-                    status_code=409)
-
         ALARMS_RULES[data.type].plugin.update_hook(data)
 
         old_data = Alarm.from_db_model(alarm_in)
@@ -763,13 +754,6 @@ class AlarmsController(rest.RestController):
         change = data.as_dict(models.Alarm)
 
         data.update_actions()
-        # make sure alarms are unique by name per project.
-        alarms = list(conn.get_alarms(name=data.name,
-                                      project=data.project_id))
-        if alarms:
-            raise base.ClientSideError(
-                _("Alarm with name='%s' exists") % data.name,
-                status_code=409)
 
         try:
             alarm_in = models.Alarm(**change)
diff --git a/aodh/tests/functional/api/v2/test_alarm_scenarios.py b/aodh/tests/functional/api/v2/test_alarm_scenarios.py
index 2858b1d94..8a6e13612 100644
--- a/aodh/tests/functional/api/v2/test_alarm_scenarios.py
+++ b/aodh/tests/functional/api/v2/test_alarm_scenarios.py
@@ -816,10 +816,10 @@ class TestAlarms(TestAlarmsBase):
         else:
             self.fail("Alarm not found")
 
-    def test_post_conflict(self):
+    def test_post_alarm_with_same_name(self):
         json = {
             'enabled': False,
-            'name': 'added_alarm',
+            'name': 'dup_alarm_name',
             'state': 'ok',
             'type': 'threshold',
             'ok_actions': ['http://something/ok'],
@@ -840,10 +840,17 @@ class TestAlarms(TestAlarmsBase):
             }
         }
 
-        self.post_json('/alarms', params=json, status=201,
-                       headers=self.auth_headers)
-        self.post_json('/alarms', params=json, status=409,
-                       headers=self.auth_headers)
+        resp1 = self.post_json('/alarms', params=json, status=201,
+                               headers=self.auth_headers)
+        resp2 = self.post_json('/alarms', params=json, status=201,
+                               headers=self.auth_headers)
+        self.assertEqual(resp1.json['name'], resp2.json['name'])
+        self.assertNotEqual(resp1.json['alarm_id'], resp2.json['alarm_id'])
+        alarms = self.get_json('/alarms',
+                               headers=self.auth_headers,
+                               q=[{'field': 'name',
+                                   'value': 'dup_alarm_name'}])
+        self.assertEqual(2, len(alarms))
 
     def _do_test_post_alarm(self, exclude_outliers=None):
         json = {
@@ -1521,12 +1528,9 @@ class TestAlarms(TestAlarmsBase):
         alarm_id = data[0]['alarm_id']
 
         resp = self.put_json('/alarms/%s' % alarm_id,
-                             expect_errors=True, status=409,
                              params=json,
                              headers=self.auth_headers)
-        self.assertEqual(
-            "Alarm with name='name1' exists",
-            resp.json['error_message']['faultstring'])
+        self.assertEqual(200, resp.status_code)
 
     def test_put_invalid_alarm_actions(self):
         json = {
diff --git a/releasenotes/notes/remove-alarm-name-unique-constraint-4fb0b14f3ad46f0b.yaml b/releasenotes/notes/remove-alarm-name-unique-constraint-4fb0b14f3ad46f0b.yaml
new file mode 100644
index 000000000..1cc14e4c4
--- /dev/null
+++ b/releasenotes/notes/remove-alarm-name-unique-constraint-4fb0b14f3ad46f0b.yaml
@@ -0,0 +1,3 @@
+---
+other:
+  - Alarm name unique constraint for each project has been removed.